logo

Reihenfolge der Methodenauflösung in Python

In diesem Tutorial lernen wir die Methodenauflösungsreihenfolge kennen, die auch als MRO bezeichnet wird. Es ist ein wesentliches Konzept der Python-Vererbung.

Die Reihenfolge der Methodenauflösung beschreibt den Suchpfad der Klasse Python Wird verwendet, um die entsprechende Methode in Klassen abzurufen, die die Mehrfachvererbung enthalten.

Einführung

Wie wir wissen, wird eine Klasse, die geerbt wird, als Unterklasse oder übergeordnete Klasse bezeichnet, während die Klasse, die erbt, als untergeordnete Klasse oder Unterklasse bezeichnet wird. Bei der Mehrfachvererbung kann eine Klasse aus vielen Funktionen bestehen. Daher wird die Technik der Methodenauflösungsreihenfolge verwendet, um die Reihenfolge zu ermitteln, in der die Basisklasse ausgeführt wird.

Mit einfachen Worten: „Die Methode oder Attribute werden in der aktuellen Klasse untersucht. Wenn die Methode in der aktuellen Klasse nicht vorhanden ist, wird die Suche auf die übergeordneten Klassen verschoben usw.“ Dies ist ein Beispiel für eine Tiefensuche.

Es spielt eine wesentliche Rolle bei der Mehrfachvererbung, bei der dieselbe Methode in mehreren Oberklassen gefunden werden kann.

Um es besser zu verstehen, schauen wir uns an, wie wir es nutzen können.

Beispiel -

Kajal Aggarwal
 class A: def myname(self): print('I am a class A') class B(A): def myname(self): print('I am a class B') class C(A): def myname(self): print('I am a class C') c = C() print(c.myname()) 

Ausgabe:

 I am a class C 

Erläuterung -

Im obigen Code gibt es eine Mehrfachvererbung. Wir haben drei Klassen mit den Namen A, B und C definiert, und diese Klassen haben den gleichen Methodennamen mein Name(). Wir haben eine Objektklasse C erstellt. Das Objekt hat Klasse C aufgerufen, nicht die Klasse, während Klasse C die Methode der Klasse A geerbt hat.

Die Reihenfolge wird im obigen Code eingehalten Klasse B -> Klasse A. Diese Technik ist als MRO (Method Resolution Order) bekannt.

Lassen Sie uns ein weiteres Beispiel für Mehrfachvererbung verstehen.

Bourne wieder Shell

Beispiel -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass d = D() d.myname() 

Ausgabe:

 I am a class B 

Erläuterung -

Im obigen Code haben wir eine weitere D-Klasse erstellt, ohne Klassenattribute zu definieren, die die B- und C-Klasse geerbt haben. Als wir die Methode aufgerufen haben mein Name(), Es geht zur Klasse D und sucht nach dem mein Name( ) Funktion. Aber Klasse D hat keine Deklaration. Daher wird die Suche auf Klasse B übertragen und erhält die mein Name() Funktion und gibt das Ergebnis zurück. Die Suche läuft wie folgt ab.

 Class D -> Class B -> Class C -> Class A 

Wenn Klasse B keine Methode hätte, ruft sie die Methode der Klasse C auf.

Hier empfehlen wir Ihnen, die Klasse-B-Methode zu entfernen und zu prüfen, was passiert. Auf diese Weise erhalten Sie eine Vorstellung davon, wie die Methodenauflösung funktioniert.

Java verkettet Zeichenfolgen

Alte und neue Stilordnung

In der älteren Version von Python (2.1) sind wir jedoch auf die Verwendung der alten Klassen beschränkt Python (2.2 & weiter) können wir die neuen Klassen verwenden. Standardmäßig verfügt Python 3 über ursprüngliche (neue) Klassen. Die erste übergeordnete Klasse der neuen Stilklasse erbt von der Python-Stammklasse „Objekt“. Sehen wir uns das folgende Beispiel an:

Beispiel -

 # Old style class class OldStyleClass: pass # New style class class NewStyleClass(object): pass 

Der Deklarationsstil beider Klassen ist unterschiedlich. Bei der Methodenauflösung folgen Klassen alten Stils dem Tiefen-zuerst-von-links-nach-rechts-Algorithmus (DLR), wohingegen Klassen neuen Stils den C3-Linearisierungsalgorithmus verwenden und dabei Mehrfachvererbung durchführen.

DLR-Algorithmus

Python erstellt eine Liste von Klassen und implementiert dabei die Mehrfachvererbung zwischen den Klassen. Diese Liste wird verwendet, um zu bestimmen, welche Methode aufgerufen werden muss, wenn sie von Instanzen aufgerufen wird.

Wir können anhand des Namens davon ausgehen, dass die Methodenauflösung zuerst in der Tiefe sucht und dann von links nach rechts geht. Unten ist das Beispiel.

Beispiel -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

Zunächst sucht der Algorithmus in der Instanzklasse nach der aufgerufenen Methode. Wenn es nicht gefunden wird, geht es in die ersten Eltern, wenn es auch nicht gefunden wird. Es wird das übergeordnete Element des übergeordneten Elements untersucht. Dies wird bis zum Ende der Vererbungsklassen fortgesetzt.

Im obigen Beispiel lautet die Reihenfolge der Methodenauflösung:

Java-Mathe
 class D -> class B -> class A -> class C -> class A 

Aber A kann nicht zweimal vorhanden sein, also -

 class D -> class B -> class A -> class C -> 

Dieser Algorithmus zeigt das damals seltsame Verhalten. Sehen wir uns das folgende Beispiel an.

Beispiel -

 class A: pass class B: pass class C(A, B): pass class D(B, A): pass class E(C,D): pass 

Gemäß dem DLR-Algorithmus lautet die Reihenfolge E, C, D, B, A. In Klasse C sind die Klassen A und B vertauscht, was sehr mehrdeutig ist. Dies bedeutet, dass der Algorithmus die Monotonieeigenschaft nicht beibehält.

Samuele Perdoni war der erste, der eine Inkonsistenz zwischen den MRO-Algorithmen entdeckte.

Gray-Code

C3-Linearisierungsalgorithmus

Der C3-Linearisierungsalgorithmus ist eine bessere Version des DLR-Algorithmus, da er die Inkonsistenz beseitigt. Für diesen Algorithmus gelten einige Einschränkungen, die im Folgenden aufgeführt sind.

  • Kinder müssen ihren Eltern vorausgehen.
  • Wenn eine bestimmte Klasse von einer oder mehreren Klassen erbt, werden diese in der im Tupel der Basisklasse angegebenen Reihenfolge gespeichert.

Regeln des C3-Linearisierungsalgorithmus

  • Die Struktur der Methodenauflösungsreihenfolge wird durch das Vererbungsdiagramm definiert.
  • Der Benutzer darf die Superklasse erst besuchen, nachdem die Methoden der lokalen Klassen besucht wurden.
  • Monotonie bewahren

Methode für die Klasse „Methodenauflösung“.

Python bietet zwei Möglichkeiten, die Methodenauflösungsreihenfolge einer Klasse abzurufen: __mro__ Attribut bzw mro() Methode. Mit Hilfe dieser Methoden können wir die Reihenfolge der Methoden anzeigen, in der sie gelöst werden.

Lassen Sie uns das folgende Beispiel verstehen.

Beispiel -

 class A: def myname(self): print(' I am a class A') class B(A): def myname(self): print(' I am a class B') class C(A): def myname(self): print('I am a class C') # classes ordering class D(B, C): pass # it prints the lookup order print(D.__mro__) print(C.mro()) 

Ausgabe:

 (, , , , ) [, , ] 

Wie wir in der obigen Ausgabe sehen können, erhalten wir die Reihenfolge der Methodenauflösungsreihenfolge. Auf diese Weise funktioniert der C3-Linearisierungsalgorithmus für die Mehrfachvererbung.