Python Tutorial
- jetzt Python programmieren lernen

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 Methodennamen 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 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.