Mehrfachvererbung üben
Python erlaubt es einer Klasse, von mehr als einer Elternklasse zu erben. Dies wird als Mehrfachvererbung (Multiple Inheritance) bezeichnet. Sie kann ein mächtiges Werkzeug sein, um Funktionalitäten aus verschiedenen Quellen zu vermischen, führt aber auch zu Komplexität, insbesondere bei der Entscheidung Pythons, welche Methode der Elternklassen verwendet werden soll, wenn diese denselben Namen haben.
Diese Suchreihenfolge wird als Method Resolution Order (MRO) bezeichnet. Python verwendet einen Algorithmus namens C3-Linearisierung, um eine konsistente und vorhersagbare MRO zu bestimmen.
Lassen Sie uns dies anhand eines neuen Beispiels untersuchen. Öffnen Sie die Datei multiple_inheritance.py im Datei-Explorer und fügen Sie den folgenden Code hinzu:
## File: multiple_inheritance.py
class ParentA:
def speak(self):
print("Speaking from ParentA")
def common_method(self):
print("ParentA's common method")
class ParentB:
def speak(self):
print("Speaking from ParentB")
def common_method(self):
print("ParentB's common method")
## Child erbt von A, dann B
class Child_AB(ParentA, ParentB):
pass
## Child erbt von B, dann A
class Child_BA(ParentB, ParentA):
def common_method(self):
print("Child_BA's own common method")
if __name__ == "__main__":
child1 = Child_AB()
child2 = Child_BA()
print("--- Investigating Child_AB (ParentA, ParentB) ---")
child1.speak()
child1.common_method()
## Die .mro()-Methode zeigt die Method Resolution Order an
print("MRO for Child_AB:", [c.__name__ for c in Child_AB.mro()])
print("\n--- Investigating Child_BA (ParentB, ParentA) ---")
child2.speak()
child2.common_method()
print("MRO for Child_BA:", [c.__name__ for c in Child_BA.mro()])
Speichern Sie die Datei. Hier erbt Child_AB von ParentA und dann von ParentB. Child_BA erbt in umgekehrter Reihenfolge. Wenn eine Methode aufgerufen wird, sucht Python in der Reihenfolge, die durch die MRO festgelegt ist, danach.
Führen Sie das Skript im Terminal aus:
python multiple_inheritance.py
Sie sehen die folgende Ausgabe:
--- Investigating Child_AB (ParentA, ParentB) ---
Speaking from ParentA
ParentA's common method
MRO for Child_AB: ['Child_AB', 'ParentA', 'ParentB', 'object']
--- Investigating Child_BA (ParentB, ParentA) ---
Speaking from ParentB
Child_BA's own common method
MRO for Child_BA: ['Child_BA', 'ParentB', 'ParentA', 'object']
Aus der Ausgabe können Sie beobachten:
child1.speak() ruft die Methode von ParentA auf, weil ParentA in der MRO von Child_AB zuerst kommt.
child2.speak() ruft die Methode von ParentB auf, weil ParentB in der MRO von Child_BA zuerst kommt.
child2.common_method() ruft die Version auf, die direkt in Child_BA definiert ist, da Python diese dort zuerst findet, bevor es die Elternklassen überprüft.
Das Verständnis der MRO ist entscheidend, um das Verhalten in Szenarien mit Mehrfachvererbung vorherzusagen.