Родительский метод вызова 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 
 
Interesting Posts for Van-Lav

Есть ли обратная функция для time.gmtime (), которая анализирует UTC-кортеж в секундах с момента эпохи?

Странное поведение python на машине с процессором ARM

lxml удаление тегов <? xml …> при разборе?

Что эквивалентно проверке строки ruby ​​() в python

Создайте рамку данных pandas и получите несегментные столбцы в виде серии

Pandas переименовывает имена столбцов с определенными шаблонами и делает агрегацию

Не удается найти правильный синтаксис регулярного выражения для соответствия новой строке или концу строки

Разница между языками системного программирования и языками программирования приложений

эффективно знать, если пересечение двух списков пусто или нет, в python

Как читать ввод с клавиатуры?

Все ли объект в python, как ruby?

Python NameError: глобальное имя «NAME» не определено! (Но он определен)

Создание файла BAT для скрипта python

При установке кривой кривой в набор данных в Python

получить индекс последнего отрицательного значения в массиве 2d на столбец

Python - лучший язык программирования в мире.