Wie stellt die Method Resolution Order (MRO) von Python eine eindeutige Methodenvererbung in Klassen neuen Stils sicher?

Barbara Streisand
Freigeben: 2024-10-31 21:07:01
Original
341 Leute haben es durchsucht

How does Python's Method Resolution Order (MRO) ensure unambiguous method inheritance in new-style classes?

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:


  1. Die Blattklasse (Unterklasse ohne Unterklassen) wird im MRO platziert.

  2. Alle Basisklassen werden dem MRO vor ihren Unterklassen hinzugefügt.

  3. Für jede Basisklasse im MRO wiederholen Sie rekursiv die Schritte 1–3 für ihre Unterklassen.

  4. Wenn eine Basisklasse mehrmals in der Hierarchie erscheint, ist sie nur einmal enthalten im MRO.

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>
Nach dem Login kopieren

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'>)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!