10.1 Vererbung von mehreren Klassen
Mehrfachvererbung in Python erlaubt einer Klasse, Attribute und Methoden von mehr als einer Elternklasse zu erben. Das bietet große Flexibilität und ermöglicht die Wiederverwendung von Code, kann aber auch zu komplexen Hierarchien und potenziellen Konflikten führen.
Die Möglichkeit, deiner Klasse fünf Elternklassen zuzuweisen, erweitert deine Möglichkeiten erheblich und macht das Schreiben von Code sehr bequem. Das ist ganz einfach – du musst nur die Elternklassen durch ein Komma trennen:
class Base1:
def method1(self):
print("Method1 from Base1")
class Base2:
def method2(self):
print("Method2 from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method1()
obj.method2()
Alles funktioniert wie geplant – einfach genial.
Es gibt jedoch einige komplexe Aspekte der Mehrfachvererbung, die man bei ihrer Verwendung unbedingt beachten sollte. Lass uns anschauen, wie das funktioniert und wie man Probleme vermeiden kann, die mit Mehrfachvererbung einhergehen.
10.2 Aufruf einer Methode, die in mehreren Basisklassen vorhanden ist
Eine Klasse kann Attribute und Methoden von mehreren Elternklassen erben, die in Klammern nach dem Klassennamen aufgelistet sind. Und diese Attribute und Methoden können dieselben Namen haben:
class Base1:
def method(self):
print("Method from Base1")
class Base2:
def method(self):
print("Method from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method() # welcher Methode wird hier aufgerufen?
In diesem Beispiel erbt die Derived
Klasse von Base1
und Base2
. Wenn method()
aufgerufen wird, wählt Python die Methode der zuerst angegebenen Klasse — Base1
.
Aber das ist nicht so offensichtlich, oder? Und wenn jemand den Code der Basisklasse ändert, kann die gesamte Anwendungslogik betroffen sein, und du merkst nicht einmal, dass etwas nicht stimmt. Es werden einfach nicht ganz die richtigen Methoden aufgerufen :)
10.3 Verwendung von super()
bei Mehrfachvererbung
Eine weitere interessante Eigenschaft ist der Aufruf von super()
für die Basisklasse bei Mehrfachvererbung.
Beispiel:
class Base1:
def method(self):
print("Method from Base1")
super().method()
class Base2:
def method(self):
print("Method from Base2")
super().method()
class Derived(Base1, Base2):
def method(self):
print("Method from Derived")
super().method()
obj = Derived()
obj.method()
Na, was wird hier ausgegeben?
Method from Derived
Method from Base1
Oder
Method from Derived
Method from Base2
Ich habe eine Überraschung für dich – die Ausgabe wird so aussehen:
Method from Derived
Method from Base1
Method from Base2
Der Code super().method()
ruft die Methode method()
bei jeder Basisklasse auf! Das sind genau die Feinheiten, von denen ich sprach, als ich die Mehrfachvererbung erstmals erwähnte.
10.4 Rautenförmige (Diamond)
Vererbung
Und schließlich das klassische Problem der rautenförmigen Vererbung. Es ist leichter, dies anhand eines Beispiels zu zeigen, als es zu beschreiben:

Im Code könnte das so aussehen:
class A:
def method(self):
print("Method from A")
class B(A):
def method(self):
print("Method from B")
super().method()
class C(A):
def method(self):
print("Method from C")
super().method()
class D(B, C):
def method(self):
print("Method from D")
super().method()
obj = D()
obj.method()
Die Ausgabe wird sein:
Method from D
Method from B
Method from C
Method from A
Damit du dich bei der Mehrfachvererbung irgendwie zurechtfindest, musst du gut wissen, in welcher Reihenfolge Python Felder und Methoden in den Elternklassen sucht. Genau darüber wirst du in der nächsten Vorlesung mehr erfahren.
GO TO FULL VERSION