Vererbung
Vererbung in der objektorientierten Programmierung das Weitergeben von Eigenschaften (Instanzvariablen und Methoden) von einer Klasse auf eine andere. Mit Vererbung können wir also eine neue Klasse erstellen, die auf einer bestehenden Klasse aufbaut. Die neue Klasse erbt dabei alle Instanzvariablen und Methoden der Superklasse. Das macht es einfacher, Code zu schreiben, wiederzuverwenden und zu organisieren.

Dieses Beispielprogramm erweitert den Code aus dem 👉 vorherigen Beispiel um zwei neue Klassen Tier und Katze.
class Tier:
def __init__(self, name, fellfarbe):
self.name = name
self.fellfarbe = fellfarbe
def sag_wie_du_heisst(self):
print("Ich heisse " + self.name + ".")
def sag_deine_fellfarbe(self, sprache):
if sprache == "de":
print("Mein Fell ist " + self.fellfarbe + ".")
elif sprache == "en":
print("My fur is " + self.fellfarbe + ".")
class Hund(Tier):
def __init__(self, name, fellfarbe):
super().__init__(name, fellfarbe)
def mach_wuff(self):
print("Wuff!!")
class Katze(Tier):
def __init__(self, name, fellfarbe, lieblingsfutter):
super().__init__(name, fellfarbe)
self.lieblingsfutter = lieblingsfutter
def mach_miau(self):
print("Miaaau!")
def sag_dein_lieblingsfutter(self):
print("Mein Lieblingsfutter ist " + self.lieblingsfutter + ".")
benno = Hund("Benno", "schwarz")
manu = Hund("Manu", "braun")
lucky = Katze("Lucky", "rot", "Poulet")
benno.mach_wuff()
benno.sag_wie_du_heisst()
benno.sag_deine_fellfarbe("de")
manu.mach_wuff()
manu.sag_wie_du_heisst()
manu.sag_deine_fellfarbe("en")
lucky.mach_miau()
lucky.sag_wie_du_heisst()
lucky.sag_deine_fellfarbe("de")
lucky.sag_dein_lieblingsfutter()
Es produziert folgende Ausgabe:
Wuff!!
Ich heisse Benno.
Mein Fell ist schwarz.
Wuff!!
Ich heisse Manu.
My fur is braun.
Miaaau!
Ich heisse Lucky.
Mein Fell ist rot.
Mein Lieblingsfutter ist Poulet.
Erklärungen:
- Zeile
15:class Hund(Tier)bedeutet, dass die KlasseHundauf der KlasseTieraufbauen soll.- Wir sagen:
HunderweitertTier. - Oder:
Hunderbt vonTier.Hundist eine Kindklasse vonTier. - Und umgekehrt:
Tierist die Superklasse vonHund.
- Wir sagen:
- Analog für Zeile
22:Katzeerweitert / erbt vonTier, ist eine Kindklasse vonTier.Tierist die Superklasse vonKatze. - Das heisst:
HundundKatzesind Spezialformen vonTier.- Sie besitzen alle Instanzvariablen und Methoden, die in
Tierdefiniert sind. Deshalb können wir den Zeilen38,39,42,46und47die Methodensag_wie_du_heisst()undsag_deine_fellfarbe()auf Instanzen vonHundundKatzeaufrufen, obwohl diese Methoden in der KlasseTierdefiniert sind (Zeilen6-13).
- Sie besitzen alle Instanzvariablen und Methoden, die in
- Der Konstruktor von
Tierdefiniert zwei Parameter:nameundfellfarbe.- Kindklassen müssen in ihrem Konstruktor den Konstruktor ihrer Superklasse (genannt, Superkonstruktor) aufrufen (Zeilen
17und24). - Dabei müssen sie Argumente für die entsprechenden Parameter des Superkonstruktors mitgeben, so wie das auf Zeilen
17und24jeweils mitnameundfellfarbegemacht wird. - Merke: Angenommen, alle Katzen wären orange. Dann dürfte der Konstruktor der Klasse
Katzeseinen Superkonstruktor beispielsweise auch mitsuper().__init__(name, "orange")aufrufen, und müsste selbst keinen Parameterfellfarbemehr definieren.
- Kindklassen müssen in ihrem Konstruktor den Konstruktor ihrer Superklasse (genannt, Superkonstruktor) aufrufen (Zeilen
- Die Klasse
Hunddefiniert eine eigene Methodemach_wuff(). Diese Methode ist demnach auf allen Instanzen vonHundverfügbar, jedoch nicht auch Instanzen vonKatze. - Das Gleiche gilt für die Methode
sag_dein_lieblingsfutter()und die darin verwendete Instanzvariableself.lieblingsessenin der KlasseKatze: sie sind beide nur in Instanzen vonKatzeverfügbar. - Die Klassen
HundundKatzekönnten selbst auch wieder erweitert werden, beispielsweise um spezifische Hunde- resp. Katzenrassen. Diese Vererbungskette kann beliebig lang sein — sie wird allerdings schnell unübersichtlich. - Die Klasse
Tierkönnte auch direkt instanziiert werden:momo = Tier("Momo", "gelb").momoverfügt in dem Fall über die Methodensag_wie_du_heisst()undsag_deine_fellfarbe().momoverfügt aber nicht über die Methodenmach_miau(),mach_wuff()odersag_dein_lieblingsfutter(), da diese nichtTier, sondern in den KindklassenHund, resp.Katzedefiniert werden.
- Eine Klasse kann theoretisch mehrere Superklassen haben. Davon ist allerdings abzuraten.