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())- Denkanstoß
Schreib
classLieferroboter(Roboter): und rufe in__init__zuerstsuper().__init__(name)auf. - Welcher Befehl hilft?
Prüfe in einladen zuerst, ob schon 3 Pakete in der Liste sind, und gib dann
Falsezurück.Benutze
super().status()und hängef", {len(self.pakete)} Pakete"an.Ändere die Klasse Roboter selbst nicht – alles Neue gehört in Lieferroboter.
- Lückencode – ergänze die ___
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(___) self.pakete = ___ def einladen(self, paket): if ___: return ___ self.pakete.append(___) return ___ def status(self): return ___ 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🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
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())