Ich habe also eine solche Situation.

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()

Das Ergebnis des Codes ist

foo from D
foo from A, call from D

Ich möchte alle übergeordneten Methoden, in diesem Fall die foo-Methode, aus der D -Klasse aufrufen, ohne Super in der übergeordneten Klasse wie A zu verwenden. Ich möchte nur den Super aus der Klasse D aufrufen. Die Klassen A, B und C sind genau wie die Mixin-Klassen, und ich möchte alle foo-Methoden von D aus aufrufen. Wie kann ich das erreichen?

14
Edwin Lunando 8 Dez. 2013 im 11:23

2 Antworten

Beste Antwort

Sie können __bases__ wie folgt verwenden

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

Mit dieser Änderung wird die Ausgabe sein

foo from D
foo from A, call from D
foo from B, call from D
foo from C, call from D
9
thefourtheye 8 Dez. 2013 im 07:46

Fügen Sie super() Aufrufe auch in anderen Klassen außer C hinzu. Da ist D's MRO

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

Sie brauchen keinen Superanruf in C.

Code:

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()

Ausgabe:

foo from D
foo from A, call from D
foo from B, call from A
foo from C, call from B
9
Ashwini Chaudhary 8 Dez. 2013 im 07:43