super verwirrende Python-Mehrfachvererbung super ()

Ich habe mit der Mehrfachvererbung in Python herumgespielt und bin auf eine Situation gestoßen, die ich nicht nachvollziehen kann.

Hier ist das Vererbungslayout:

    A       F
  /   \     |
 B     C    |   
  \    |   /
    \  |  /   
       D

Der ABCD-Diamant, mit dem jeder vertraut ist. Plus eine Extraklasse "F", die ich zum Spaß reinwerfe.

Hier ist der 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(A):
    def foo(self, call_from):
        print "foo from B, call from %s" % call_from
        super(B, self).foo("B")

class C(A):
    def foo(self, call_from):
        print "foo from C, call from %s" % call_from
        super(C, self).foo("C")

class F(object):
    def foo(self, call_from):
        print "foo from F, call from %s" % call_from

class D(B, C, F):
    def foo(self):
        print "foo from D"
        super(D, self).foo("D")

Ausgabe:

>>> d = D()
>>> d.foo()
foo from D
foo from B, call from D
foo from C, call from B
foo from A, call from C
foo from F, call from A

Die Reihenfolge der Methodenauflösung:

>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.F'>, <type 'object'>)
foo from C, call from B anstattfoo from C, call from Dfoo from F, call from A wirf mich einfach weg ...

Es scheint wie dassuper() sind nach der Reihenfolge der Methodenauflösung verkettet und ignorieren die Beziehung zwischen Klassen, aber ich bin mir nicht sicher.

Kann mich jemand in die richtige Richtung weisen, um dieses Verhalten zu verstehen?

Bitte denken Sie daran, dass ich versuche, die Sprache selbst zu verstehen. Nicht versuchen, ein praktisches Problem zu lösen. Ich habe also keinen Anwendungsfall dafür. Aber es wäre schön, wenn jemand auf einen Anwendungsfall hinweisen könnte :)

AKTUALISIEREN:

Zusammenfassend lässt Sie super () einfach wissen, was als nächstes als Basis für die mro bezeichnet wird. Es ist nicht notwendig, die Eltern. Während mro auf der Vererbungshierarchie basiert, ist mro selbst nicht die Vererbungshierarchie.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage