Fehler bei der Reihenfolge der Methodenauflösung
-
12-12-2019 - |
Frage
Dies ist eher eine Frage der Neugier als ein ernstes Problem:
Ich habe mit Mehrfachvererbung herumgespielt und bin auf Folgendes gestoßen:
>>> class A(object):
... def __init__(self): print "A.__init__() called"
...
>>> class B(object, A): pass
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Cannot create consisten method resolution
order (MRO) for bases object, A
Ich bekomme ein TypeError
.Wenn ich jedoch die Reihenfolge der Mehrfachvererbung umkehre:
>>> class B(A, object): pass
>>> b = B()
A.__init__() called
Es funktioniert gut.Ich ging davon aus, dass es in erster Linie um die Vererbung von geht object
Vor A
erzeugt eine Art Namensmehrdeutigkeit.Möchte jemand erklären, was hier vor sich geht?
Lösung
A
wird geerbt von object
oder Unterklasse von object
, es funktioniert nicht.Das MRO garantiert, dass die Basen ganz links vor den Basen ganz rechts besucht werden – aber es garantiert auch, dass unter den Vorfahren, wenn x eine Unterklasse von y ist, x vor y besucht wird.In diesem Fall ist es unmöglich, beide Garantien zu erfüllen
Hier ist eine ähnliche Frage
Python:Problem mit Metaklassen in Verbindung mit Mehrfachvererbung