Zum Inhalt springen
BetaEN
Lektion 25 von 35Python

Python · Lektion 25 · 30 Minuten

Vererbung – Klassen erweitern

Das lernst du

  • Eine Klasse von einer anderen erben lassen
  • Methoden überschreiben und mit super() erweitern
  • Mit isinstance() prüfen, was ein Objekt ist

Nicht alles doppelt schreiben

Stell dir vor, du hast eine Klasse Roboter mit Name, Akku und Statusanzeige. Jetzt brauchst du einen Lieferroboter: Er kann alles, was ein Roboter kann – und zusätzlich Pakete tragen. Statt alles neu zu schreiben, lässt du die neue Klasse erben:

class Tier:
    def __init__(self, name):
        self.name = name

    def vorstellen(self):
        return f"Ich bin {self.name}."

class Hund(Tier):
    def bellen(self):
        return "Wuff!"

bello = Hund("Bello")
print(bello.vorstellen())
print(bello.bellen())

class Hund(Tier): heißt: Ein Hund ist ein Tier. Er bekommt alle Methoden von Tier geschenkt – und kann eigene dazubekommen.

Überschreiben und super()

Eine Kindklasse darf eine geerbte Methode überschreiben, also eine eigene Version schreiben. Mit super() rufst du dabei die Version der Elternklasse auf:

class Tier:
    def __init__(self, name):
        self.name = name

    def vorstellen(self):
        return f"Ich bin {self.name}."

class Katze(Tier):
    def __init__(self, name, lieblingsfutter):
        super().__init__(name)
        self.lieblingsfutter = lieblingsfutter

    def vorstellen(self):
        return super().vorstellen() + f" Ich liebe {self.lieblingsfutter}."

print(Katze("Luna", "Thunfisch").vorstellen())

Drück auf Schritte: Du siehst, wie Python von Katze.vorstellen in Tier.vorstellen springt und wieder zurück.

Was ist was?

isinstance() prüft, ob ein Objekt zu einer Klasse gehört – auch über Vererbung hinweg:

class Fahrzeug: pass
class Auto(Fahrzeug): pass
class Fahrrad(Fahrzeug): pass

dinge = [Auto(), Fahrrad(), "Ball"]
for ding in dinge:
    print(type(ding).__name__, isinstance(ding, Fahrzeug))

Merke: Vererbung passt, wenn man sagen kann „ein X ist ein Y“ – ein Hund ist ein Tier, ein Lieferroboter ist ein Roboter. Ein Roboter „hat“ dagegen einen Motor – das löst man mit einer Eigenschaft, nicht mit Vererbung.

Kurz-Check

Bevor es an die Aufgabe geht: Was gibt dieses Programm aus? Tipp deine Vermutung ein – Python rechnet danach nach.

class Tier:
    def laut(self):
        return "..."


class Katze(Tier):
    def laut(self):
        return "Miau"


class Fisch(Tier):
    pass


print(Katze().laut(), Fisch().laut())

Deine Aufgabe

Jetzt bist du dran

Die Klasse Roboter ist fertig. Schreib eine Klasse Lieferroboter, die von Roboter erbt. Sie bekommt zusätzlich eine Liste pakete (am Anfang leer) und die Methode einladen(paket). Ein Lieferroboter trägt höchstens 3 Pakete – ist er voll, gibt einladen False zurück, sonst True. Überschreibe status(), sodass hinten , 2 Pakete angehängt wird (mit der echten Anzahl).

class Roboter:
    def __init__(self, name):
        self.name = name
        self.akku = 100

    def status(self):
        return f"{self.name}: {self.akku} %"


# Deine Klasse Lieferroboter


lieferung = Lieferroboter("Paketo")
lieferung.einladen("Buch")
lieferung.einladen("Ball")
print(lieferung.status())

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

class Roboter:
    def __init__(self, name):
        self.name = name
        self.akku = 100

    def status(self):
        return f"{self.name}: {self.akku} %"


class Lieferroboter(Roboter):
    def __init__(self, name):
        super().__init__(name)
        self.pakete = []

    def einladen(self, paket):
        if len(self.pakete) >= 3:
            return False
        self.pakete.append(paket)
        return True

    def status(self):
        return super().status() + f", {len(self.pakete)} Pakete"


lieferung = Lieferroboter("Paketo")
lieferung.einladen("Buch")
lieferung.einladen("Ball")
print(lieferung.status())