Method Resolution Order (MRO) in New-Style-Klassen
Im Kontext der klassenbasierten Programmierung von Python ist Method Resolution Order (MRO ) definiert die Reihenfolge, in der Methodensuchen für Instanzen einer Klasse durchgeführt werden. Die Implementierung von MRO unterscheidet sich zwischen Klassen im alten und neuen Stil.
Vererbung von Klassen im alten Stil
In Klassen im alten Stil folgt der MRO einer Tiefen- erster Ansatz. Bei der Suche nach einer Methode in einer Instanz einer Unterklasse durchläuft der Interpreter die Vererbungshierarchie der Unterklasse mit der Tiefe zuerst. Das erste Vorkommen der Methode in den Basisklassen wird zurückgegeben.
Vererbung von Klassen im neuen Stil
Mit der Einführung von Klassen im neuen Stil wurde die MRO-Semantik auf C3 geändert Linearisierung. Dieser Ansatz beseitigt die Mehrdeutigkeit, die durch mehrfaches Vorkommen derselben Basisklasse in der Vererbungshierarchie entsteht. Der MRO für Klassen neuen Stils wird wie folgt berechnet:
Beispiel mit Mehrfachvererbung
Betrachten Sie das folgende Beispiel mit Mehrfachvererbung in Klassen neuen Stils:
<code class="python">class Base1(object): def amethod(self): print("Base1") class Base2(Base1): pass class Base3(object): def amethod(self): print("Base3") class Derived(Base2, Base3): pass instance = Derived() instance.amethod() print(Derived.__mro__) </code>
Obwohl Base1 in diesem Beispiel mehrmals in der Vererbungshierarchie vorkommt, ist die MRO für Derived ist:
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
Diese Reihenfolge entspricht dem oben beschriebenen C3-Linearisierungsalgorithmus. Da Derived die Blattklasse ist, wird sie im MRO an erster Stelle platziert. Anschließend werden die Basisklassen hinzugefügt: Base2 (eine Unterklasse von Base1) und Base3, in dieser Reihenfolge. Schließlich wird das Objekt als ultimative Basisklasse hinzugefügt.
Fazit
Das MRO für Klassen neuen Stils bietet eine deterministische und eindeutige Methode zum Auflösen der Methodenvererbung. Dadurch werden mögliche Mehrdeutigkeiten beseitigt, die durch mehrfaches Vorkommen derselben Basisklasse entstehen können, wie es bei der Klassenvererbung im alten Stil der Fall war.
Das obige ist der detaillierte Inhalt vonWie stellt die Method Resolution Order (MRO) von Python eine eindeutige Methodenvererbung in Klassen neuen Stils sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!