Verständnis der Methodenauflösungsreihenfolge (Method Resolution Order, MRO)
In diesem Schritt lernen Sie die Methodenauflösungsreihenfolge (Method Resolution Order, MRO) in Python kennen. Die MRO ist die Reihenfolge, in der Python nach einer Methode in einer Klassenhierarchie sucht. Sie ist besonders wichtig, wenn es um Mehrfachvererbung geht.
Erstellen wir eine neue Reihe von Klassen, um die MRO zu veranschaulichen. Erstellen Sie mit dem VS Code-Editor eine Datei namens animal.py
in Ihrem ~/project
-Verzeichnis:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
Speichern Sie die Datei animal.py
.
Jetzt erstellen wir eine neue Datei namens mro_example.py
im ~/project
-Verzeichnis, um die MRO zu demonstrieren:
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
Speichern Sie die Datei mro_example.py
.
In diesem Beispiel:
Animal
ist die Basisklasse mit einer speak
-Methode.
Mammal
erbt von Animal
und überschreibt die speak
-Methode.
Dog
erbt von Mammal
und überschreibt die speak
-Methode.
Cat
erbt von Mammal
und überschreibt die speak
-Methode.
Wenn Sie my_dog.speak()
aufrufen, sucht Python zunächst nach der speak
-Methode in der Dog
-Klasse. Wenn es sie dort nicht findet, sucht es in der Mammal
-Klasse und dann in der Animal
-Klasse. Diese Reihenfolge wird durch die MRO festgelegt.
Um das Skript mro_example.py
auszuführen, öffnen Sie Ihr Terminal und navigieren Sie zum ~/project
-Verzeichnis:
cd ~/project
Führen Sie dann das Skript mit dem python
-Befehl aus:
python mro_example.py
Sie sollten die folgende Ausgabe sehen:
Woof!
Meow!
Jetzt betrachten wir ein komplexeres Beispiel mit Mehrfachvererbung. Erstellen Sie eine neue Datei namens mro_complex.py
im ~/project
-Verzeichnis:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
Speichern Sie die Datei mro_complex.py
.
In diesem Beispiel:
- Die Klasse
D
erbt sowohl von B
als auch von C
.
- Sowohl
B
als auch C
erben von A
.
- Die
method
ist in allen drei Klassen A
, B
und C
definiert.
Um das Skript mro_complex.py
auszuführen, öffnen Sie Ihr Terminal und navigieren Sie zum ~/project
-Verzeichnis:
cd ~/project
Führen Sie dann das Skript mit dem python
-Befehl aus:
python mro_complex.py
Sie sollten die folgende Ausgabe sehen:
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
Die Ausgabe B
zeigt an, dass die method
aus der Klasse B
aufgerufen wird. Die Methode D.mro()
gibt ein Tupel zurück, das die Methodenauflösungsreihenfolge für die Klasse D
darstellt. In diesem Fall ist die MRO D -> B -> C -> A -> object
. Das bedeutet, dass wenn Sie d.method()
aufrufen, Python zunächst nach der Methode in der Klasse D
sucht, dann in der Klasse B
, dann in der Klasse C
, dann in der Klasse A
und schließlich in der Basisklasse object
.
Das Verständnis der MRO ist unerlässlich, um das Verhalten Ihres Codes bei der Verwendung von Vererbung, insbesondere Mehrfachvererbung, vorherzusagen.