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 KlasseHund
auf der KlasseTier
aufbauen soll.- Wir sagen:
Hund
erweitertTier
. - Oder:
Hund
erbt vonTier
.Hund
ist eine Kindklasse vonTier
. - Und umgekehrt:
Tier
ist die Superklasse vonHund
.
- Wir sagen:
- Analog für Zeile
22
:Katze
erweitert / erbt vonTier
, ist eine Kindklasse vonTier
.Tier
ist die Superklasse vonKatze
. - Das heisst:
Hund
undKatze
sind Spezialformen vonTier
.- Sie besitzen alle Instanzvariablen und Methoden, die in
Tier
definiert sind. Deshalb können wir den Zeilen38
,39
,42
,46
und47
die Methodensag_wie_du_heisst()
undsag_deine_fellfarbe()
auf Instanzen vonHund
undKatze
aufrufen, obwohl diese Methoden in der KlasseTier
definiert sind (Zeilen6
-13
).
- Sie besitzen alle Instanzvariablen und Methoden, die in
- Der Konstruktor von
Tier
definiert zwei Parameter:name
undfellfarbe
.- Kindklassen müssen in ihrem Konstruktor den Konstruktor ihrer Superklasse (genannt, Superkonstruktor) aufrufen (Zeilen
17
und24
). - Dabei müssen sie Argumente für die entsprechenden Parameter des Superkonstruktors mitgeben, so wie das auf Zeilen
17
und24
jeweils mitname
undfellfarbe
gemacht wird. - Merke: Angenommen, alle Katzen wären orange. Dann dürfte der Konstruktor der Klasse
Katze
seinen Superkonstruktor beispielsweise auch mitsuper().__init__(name, "orange")
aufrufen, und müsste selbst keinen Parameterfellfarbe
mehr definieren.
- Kindklassen müssen in ihrem Konstruktor den Konstruktor ihrer Superklasse (genannt, Superkonstruktor) aufrufen (Zeilen
- Die Klasse
Hund
definiert eine eigene Methodemach_wuff()
. Diese Methode ist demnach auf allen Instanzen vonHund
verfügbar, jedoch nicht auch Instanzen vonKatze
. - Das Gleiche gilt für die Methode
sag_dein_lieblingsfutter()
und die darin verwendete Instanzvariableself.lieblingsessen
in der KlasseKatze
: sie sind beide nur in Instanzen vonKatze
verfügbar. - Die Klassen
Hund
undKatze
kö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
Tier
könnte auch direkt instanziiert werden:momo = Tier("Momo", "gelb")
.momo
verfügt in dem Fall über die Methodensag_wie_du_heisst()
undsag_deine_fellfarbe()
.momo
verfügt aber nicht über die Methodenmach_miau()
,mach_wuff()
odersag_dein_lieblingsfutter()
, da diese nichtTier
, sondern in den KindklassenHund
, resp.Katze
definiert werden.
- Eine Klasse kann theoretisch mehrere Superklassen haben. Davon ist allerdings abzuraten.