Mehrfachvererbung üben
In Python kann eine Klasse von mehreren Elternklassen erben. Dies wird als Mehrfachvererbung bezeichnet. Mehrfachvererbung ermöglicht es einer Klasse, Attribute und Methoden von mehr als einer Basisklasse zu erben und Funktionen aus verschiedenen Quellen zu kombinieren.
Bei der Verwendung von Mehrfachvererbung ist es wichtig, die Method Resolution Order (MRO) zu verstehen, die die Reihenfolge angibt, in der Python nach Methoden und Attributen in einer Klassenhierarchie sucht. Python verwendet den C3-Linearisierungsalgorithmus, um die MRO zu bestimmen.
Erstellen wir eine neue Python-Datei namens multiple_inheritance.py
in Ihrem ~/project
-Verzeichnis, um die Mehrfachvererbung zu demonstrieren. Öffnen Sie die Datei und fügen Sie den folgenden Code hinzu:
## File Name: multiple_inheritance.py
class A:
a = 1
b = 1
def method_a(self):
print("Method from class A")
class B:
a = 2
b = 2
def method_b(self):
print("Method from class B")
class C(A):
a = 3
c = 4
def method_c(self):
print("Method from class C")
class D(B, C):
d = 4
def method_d(self):
print("Method from class D")
class E(C, B):
pass
Speichern Sie die Datei. In diesem Beispiel erbt D
sowohl von B
als auch von C
, und C
erbt von A
. E
erbt ebenfalls von C
und B
, jedoch in einer anderen Reihenfolge.
Öffnen wir nun ein Terminal und führen Sie dieses Skript aus, um zu untersuchen, wie Attribute und Methoden in diesem Mehrfachvererbungs-Setup zugegriffen werden.
python multiple_inheritance.py
Nachdem Sie das Skript ausgeführt haben, interagieren wir im Python-Interpreter mit den Klassen, um die Auswirkung der Mehrfachvererbung und der MRO zu sehen.
python
Importieren Sie die Klassen:
from multiple_inheritance import A, B, C, D, E
Greifen wir nun auf einige Attribute zu und rufen einige Methoden auf:
print(D().a)
print(D().b)
print(D().d)
D().method_a()
D().method_b()
D().method_c()
D().method_d()
print(E().a)
print(E().b)
E().method_a()
E().method_b()
E().method_c()
Beobachten Sie die Ausgabe. Wenn Sie auf D().a
zugreifen, sucht Python nach a
in D
. Es ist nicht vorhanden, also prüft es die Elternklassen in der Reihenfolge, die in der Vererbungsliste angegeben ist: zuerst B
, dann C
. Es findet a
zuerst in B
und gibt daher 2
aus. Ähnlich findet es für D().b
zuerst b
in B
und gibt 2
aus.
Für E().a
sucht Python in E
, dann in C
, dann in A
. Es findet a
zuerst in C
und gibt 3
aus. Für E().b
sucht es in E
, dann in C
, dann in A
, dann in B
. Es findet b
in B
und gibt 2
aus.
Um die Suchreihenfolge klarer zu verstehen, können Sie die Methode mro()
einer Klasse verwenden. Sehen wir uns die MRO für die Klassen D
und E
an:
print(D.mro())
print(E.mro())
Die Ausgabe zeigt die Reihenfolge an, in der Python nach Methoden und Attributen sucht. Für D(B, C)
ist die MRO typischerweise [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
. Für E(C, B)
ist die MRO typischerweise [<class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
. Die genaue Ausgabe kann je nach Python-Version und Umgebung leicht variieren, aber die Reihenfolge Ihrer definierten Klassen sollte konsistent sein.
Das Verständnis der MRO ist entscheidend, wenn Sie mit Mehrfachvererbung arbeiten, um vorherzusagen, auf welche Methode oder welches Attribut zugegriffen wird, wenn es Konflikte in den Elternklassen gibt.