Dieser Artikel enthält einen Ausschnitt, der die Verwendung von __bases__
zum dynamischen Ändern der Vererbungshierarchie von Python-Code zeigt, indem eine Klasse zu einer vorhandenen Klassensammlung von Klassen hinzugefügt wird, von denen er erbt. Ok, das ist schwer zu lesen, Code ist wahrscheinlich klarer:
class Friendly:
def hello(self):
print 'Hello'
class Person: pass
p = Person()
Person.__bases__ = (Friendly,)
p.hello() # prints "Hello"
Das heißt, Person
erbt nicht Friendly
auf Quellenebene, sondern diese Vererbungsbeziehung wird zur Laufzeit dynamisch hinzugefügt, indem das __bases__
Attribut der Person-Klasse geändert wird. Wenn Sie jedoch ändern Friendly
und Person
neue Stilklassen werden (indem Sie vom Objekt erben), wird der folgende Fehler angezeigt:
TypeError: __bases__ assignment: 'Friendly' deallocator differs from 'object'
Ein bisschen Googeln scheint auf einige Inkompatibilitäten zwischen Klassen neuen und alten Stils hinsichtlich der Änderung der Vererbungshierarchie zur Laufzeit hinzuweisen . Insbesondere: "Klassenobjekte neuen Stils unterstützen keine Zuordnung zu ihrem Basisattribut " .
Meine Frage, ist es möglich, das obige Friendly / Person-Beispiel mithilfe von Klassen neuen Stils in Python 2.7+ zum Laufen zu bringen, möglicherweise mithilfe des __mro__
Attributs?
Haftungsausschluss: Mir ist völlig klar, dass dies obskurer Code ist. Mir ist völlig klar, dass in echten Produktionscodes solche Tricks eher unlesbar sind. Dies ist ein reines Gedankenexperiment, und für Funzies ist es wichtig, etwas darüber zu lernen, wie Python mit Problemen im Zusammenhang mit Mehrfachvererbung umgeht.