У меня есть два класса и методы с одинаковым именем. У меня есть объект производного класса. Когда я вызываю метод (foo) из объекта производного класса, он должен вызывать метод базового класса.
class A:
def foo(self):
print "A Foo"
class B(A):
def foo(self):
print "B Foo"
b = B()
b.foo() # "B Foo"
После некоторого поиска я получил какое-то решение, как показано ниже, и не уверен, правильно ли это сделать или нет.
a = A()
b.__class__.__bases__[0].foo(a) # A Foo
Есть ли лучший способ сделать это.






Если вы используете Python 3, используйте super:
class A:
def talk(self):
print('Hi from A-land!')
class B(A):
def talk(self):
print('Hello from B-land!')
def pass_message(self):
super().talk()
b = B()
b.talk()
b.pass_message()
Выход:
Hello from B-land!
Hi from A-land!
Вы можете сделать то же самое в Python 2, если вы наследуете от object и указываете параметры super:
class B(A):
def talk(self):
print('Hello from B-land!')
def pass_message(self):
super(B, self).talk()
b = B()
b.talk()
b.pass_message()
Выход:
Hello from B-land!
Hi from A-land!
Вы также можете вызвать метод, как если бы это была бесплатная функция:
A.talk(b)
B.talk(b) # the same as b.talk()
Выход:
Hi from A-land!
Hello from B-land!
Спасибо за Ваш ответ. У меня есть несколько методов в производном классе и базовом классе с тем же именем. В зависимости от сценария мне нужно вызвать методы A или B.
@Gopi: Похоже, вы выбрали плохой дизайн, и вам следует его переделать.
@ user2357112 вы правы. Работа с наследием. :(
@Gopi Как это связано с моим ответом?
@gmds Я имел в виду, что у меня есть несколько переопределенных методов в дочернем классе. Я не могу создавать такие методы, как pass_message, чтобы все вызывали методы базового класса.
@Gopi Тогда используйте третье предложение ...?
Когда вы вызываете метод (foo) из объекта производного класса, он не будет вызывать метод базового класса, потому что вы его подавляющий. Вы можете использовать другое имя метода для вашего базового класса или производного класса, чтобы устранить помехи.
Вы должны перейти на Python 3. Если вы должны использовать Python 2,
Aдолжен наследоваться отobject, чтобы сделать его классом нового стиля (где "новый" означает Python 2.2 и выше, или около 17 лет!), тогда вы можете использоватьsuper.