Родительский метод вызова Python Множественное наследование

Итак, у меня такая ситуация.

class A(object): def foo(self, call_from): print "foo from A, call from %s" % call_from class B(object): def foo(self, call_from): print "foo from B, call from %s" % call_from class C(object): def foo(self, call_from): print "foo from C, call from %s" % call_from class D(A, B, C): def foo(self): print "foo from D" super(D, self).foo("D") d = D() d.foo() 

Результатом кода является

 foo from D foo from A, call from D 

Я хочу вызвать весь родительский метод, в данном случае, метод foo, из класса D не используя super в родительском классе, таком как A Я просто хочу назвать супер из класса D Класс A , B и C подобен классу mixin, и я хочу вызвать все методы foo из D Как я могу достичь этого?

2 Solutions collect form web for “Родительский метод вызова Python Множественное наследование”

Вы можете использовать __bases__ как это

 class D(A, B, C): def foo(self): print "foo from D" for cls in D.__bases__: cls().foo("D") 

С этим изменением выход будет

 foo from D foo from A, call from D foo from B, call from D foo from C, call from D 

Добавьте вызов super() в другие классы, кроме C Поскольку DRO MRO

 >>> D.__mro__ (<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <type 'object'>) 

Вам не нужен супер-вызов в C

Код:

 class A(object): def foo(self, call_from): print "foo from A, call from %s" % call_from super(A,self).foo('A') class B(object): def foo(self, call_from): print "foo from B, call from %s" % call_from super(B, self).foo('B') class C(object): def foo(self, call_from): print "foo from C, call from %s" % call_from class D(A, B, C): def foo(self): print "foo from D" super(D, self).foo("D") d = D() d.foo() 

Вывод:

 foo from D foo from A, call from D foo from B, call from A foo from C, call from B 
Python - лучший язык программирования в мире.