Attribute und Methoden in Klassen überschreiben
Unser Programm aus dem letzten Kapitel ist für die Katz (wortwörtlich). Der Hund zieht den Kürzeren, da er sich nicht korrekt mitteilen kann. Die geerbte Methode passt nicht!
Aber was ist mit Methoden, die so nicht passen? Unsere Methode „tut_miauen()“ mag ja noch für die Katze passen, ist aber beim Hund merkwürdig. Also bekommt die Elternklasse die Methode „tut_reden()“ (sorry, ein besserer Methodenname fällt mir gerade nicht ein). Bei der „Rede“ kommt noch als Ausgabe, wer da gerade redet:
Wir erhalten:
Sammy sagt: miau
Bello sagt: miau miau miau
Unser bisher entstandener kompletter Code:
class Tier():
""" Klasse für das Erstellen von Säugetieren """
def __init__(self, rufname, farbe, alter):
self.rufname = rufname
self.farbe = farbe
self.alter = alter
self.schlafdauer = 0
def tut_schlafen(self, dauer):
print(self.rufname, " schläft jetzt ", dauer , " Minuten ")
self.schlafdauer += dauer
print(self.rufname, " Schlafdauer insgesamt: ", self.schlafdauer, " Minuten ")
def tut_reden(self, anzahl = 1):
print(self.rufname, "sagt: ", anzahl * "miau ")
class BauplanKatzenKlasse(Tier):
""" Klasse für das Erstellen von Katzen """
def __init__(self, rufname, farbe, alter):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname, farbe, alter)
class Hund(Tier):
""" Klasse für das Erstellen von Hunden """
def __init__(self, rufname, farbe, alter):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname, farbe, alter)
katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)
hund_bello = Hund("Bello", "braun", 5)
katze_sammy.tut_reden(1)
hund_bello.tut_reden(3)
Als Ergebnis miaut nun unser Hund :(
Sammy sagt: miau
Bello sagt: miau miau miau
Das ist natürlich für den Hund frustrierend und führt langfristig zu Hundedepressionen. Dem wollen wir vorbeugen.
Methoden Überschreiben in der objektorientierten Programmierung
Wir können Methoden überschreiben. Passt eine geerbte Methode nicht, können wir diese in der Kindklasse einfach überschreiben. Unser Hund im Beispiel soll artgerecht bellen.
Also erzeugen wir in der Hund-Klasse eine Methode mit dem exakt gleichen Namen! Somit wird diese bei Aufruf ausgeführt und somit überschreibt diese die Methode der Elternklasse:
Unsere Hundeklasse:
class Hund(Tier):
""" Klasse für das Erstellen von Hunden """
def __init__(self, rufname, farbe, alter):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname, farbe, alter)
def tut_reden(self, anzahl = 1):
print(self.rufname, "sagt: ", anzahl * "WAU ")
Wird nun eine Unterhaltung zwischen Hund und Katze gehalten, läuft diese wie gewohnt ab:
katze_sammy.tut_reden(1)
hund_bello.tut_reden(3)
Mit dem Ergebnis:
Sammy sagt: miau
Bello sagt: WAU WAU WAU
Und der komplette Code:
class Tier():
""" Klasse für das Erstellen von Säugetieren """
def __init__(self, rufname, farbe, alter):
self.rufname = rufname
self.farbe = farbe
self.alter = alter
self.schlafdauer = 0
def tut_schlafen(self, dauer):
print(self.rufname, " schläft jetzt ", dauer , " Minuten ")
self.schlafdauer += dauer
print(self.rufname, " Schlafdauer insgesamt: ", self.schlafdauer, " Minuten ")
def tut_reden(self, anzahl = 1):
print(self.rufname, "sagt: ", anzahl * "miau ")
class BauplanKatzenKlasse(Tier):
""" Klasse für das Erstellen von Katzen """
def __init__(self, rufname, farbe, alter):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname, farbe, alter)
class Hund(Tier):
""" Klasse für das Erstellen von Hunden """
def __init__(self, rufname, farbe, alter):
""" Initalisieren über Eltern-Klasse """
super().__init__(rufname, farbe, alter)
def tut_reden(self, anzahl = 1):
print(self.rufname, "sagt: ", anzahl * "WAU ")
katze_sammy = BauplanKatzenKlasse("Sammy", "orange", 3)
hund_bello = Hund("Bello", "braun", 5)
katze_sammy.tut_reden(1)
hund_bello.tut_reden(3)
Zeit zum Üben: Vererbung beim Auto und Methoden überschreiben
Unsere Klasse „Pkw“ aus der letzten Übung soll eine weitere Geschwisterklasse (nicht von der man erbt) bekommen, den „Lkw“. Alle bisher vorhandenen Eigenschaften und Methoden sollen in die Elternklasse „Fahrzeug“ verlagert werden.
Das Auto soll zusätzlich die Eigenschaft kofferraumvolumen
bekommen.
Beim Lkw soll die Methode „parken()“ überschrieben werden. Es soll als Ausgabe kommen „auf Firmenhof abgestellt“.
Der Lkw soll eine zusätzliche Methode bekommen: aufladen()
Unser bisheriger Code aus der letzten Lösung, der jetzt erweitert werden soll.
class Pkw():
""" Klasse für das Erstellen von Personenkraftwagen """
def __init__(self, farbe, baujahr, kmstand, sitze, marke):
""" Eigenschaften farbe, baujahr, kmstand, Sitzplätze, Marke erfassen """
self.farbe = farbe
self.baujahr = baujahr
self.kmstand = kmstand
self.sitze = sitze
self.marke = marke
def hupen(self):
""" hier sollte noch eine MP3-Datei ausgegeben werden """
print("Trööt")
def fahren(self, km):
""" wie viele KM gefahren werden, was dem Tachostand aufaddiert wird """
self.kmstand += km
print("Ich fahre ", km, " Kilometer")
print("Insgesamt bin ich ", self.kmstand ," gefahren")
def parken(self):
""" neben fahren schon das größere Problem in Städten """
print("Ich habe eine Parkplatz gefunden")
def kilometerstand(self):
""" Ausgabe des KM-Standes vom Tacho """
print("Ich habe ", str(self.kmstand) ," auf dem Tacho")
trabi = Pkw("rot", 1981, 143000, 4, "Trabi")
trabi.hupen()
trabi.kilometerstand()
trabi.fahren(5)
Viel Spaß beim Umbauen.