Родительский метод вызова 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. Как я могу достичь этого?

Ответ 1

Вы можете использовать __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

Ответ 2

Добавьте super() вызов в другие классы, кроме C. Поскольку D 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