Kurz: Mit Vererbung baust du neue Klassen auf bestehenden auf. Die neue Klasse (Unterklasse) übernimmt alle Attribute und Methoden der Oberklasse und kann sie erweitern oder ersetzen.
Teil des Kurses Python
Mit Vererbung baust du neue Klassen auf bestehenden auf. Die neue Klasse (Unterklasse) übernimmt alle Attribute und Methoden der Oberklasse und kann sie erweitern oder ersetzen.
Grundprinzip
class Tier:
def __init__(self, name):
self.name = name
def laut(self):
return "..."
def vorstellen(self):
return f"{self.name} macht {self.laut()}"
class Hund(Tier):
def laut(self):
return "Wuff"
class Katze(Tier):
def laut(self):
return "Miau"
for t in [Hund("Rex"), Katze("Mimi"), Tier("Etwas")]:
print(t.vorstellen())Ausgabe:
Rex macht Wuff
Mimi macht Miau
Etwas macht ...Hund und Katze erben __init__ und vorstellen, überschreiben aber laut. Obwohl vorstellen nur in Tier steht, ruft es automatisch die passende laut-Version auf. Das nennt man Polymorphie (Vielgestaltigkeit): derselbe Aufruf, je nach Objekt anderes Verhalten.
super(): die Oberklasse aufrufen
Wenn die Unterklasse eigene Daten braucht, ruft sie mit super() den Konstruktor der Oberklasse auf:
class Fahrzeug:
def __init__(self, marke):
self.marke = marke
def info(self):
return f"Fahrzeug: {self.marke}"
class Auto(Fahrzeug):
def __init__(self, marke, tueren):
super().__init__(marke)
self.tueren = tueren
def info(self):
return super().info() + f", {self.tueren} Türen"
a = Auto("VW", 4)
print(a.info())Ausgabe:
Fahrzeug: VW, 4 TürenTypen prüfen
class A: pass
class B(A): pass
b = B()
print(isinstance(b, B), isinstance(b, A), isinstance(b, str))
print(issubclass(B, A))
print(B.__mro__)Ausgabe:
True True False
True
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)isinstance prüft, ob ein Objekt zu einer Klasse (oder deren Unterklasse) gehört. __mro__ zeigt die Method Resolution Order: In dieser Reihenfolge sucht Python nach Methoden.
Mehrfachvererbung
Eine Klasse kann von mehreren erben. Python löst Konflikte nach der MRO:
class Fliegt:
def bewegen(self):
return "fliegt"
class Schwimmt:
def bewegen(self):
return "schwimmt"
class Ente(Fliegt, Schwimmt):
pass
print(Ente().bewegen())
print([k.__name__ for k in Ente.__mro__])Ausgabe:
fliegt
['Ente', 'Fliegt', 'Schwimmt', 'object']Tipp
Mehrfachvererbung wird schnell unübersichtlich. Üblich ist sie vor allem für kleine Mixin-Klassen, die eine einzelne Fähigkeit beisteuern.
Abstrakte Klassen
Wenn eine Oberklasse nur eine Vorlage sein soll, die Unterklassen ausfüllen müssen, nimmst du das Modul abc:
from abc import ABC, abstractmethod
class Form(ABC):
@abstractmethod
def flaeche(self): ...
class Quadrat(Form):
def __init__(self, a):
self.a = a
def flaeche(self):
return self.a ** 2
print(Quadrat(3).flaeche())
try:
Form()
except TypeError as e:
print("Nicht erlaubt:", "abstract" in str(e))Ausgabe:
9
Nicht erlaubt: TrueKomposition statt Vererbung
Nicht alles ist eine “ist-ein”-Beziehung. Ein Auto ist kein Motor, es hat einen. In solchen Fällen speicherst du ein Objekt als Attribut (Komposition):
class Motor:
def starten(self):
return "brumm"
class Auto:
def __init__(self):
self.motor = Motor()
def starten(self):
return self.motor.starten()
print(Auto().starten())Ausgabe:
brummHinweis
Faustregel: Vererbung für “ist ein” (Hund ist ein Tier), Komposition für “hat ein” (Auto hat einen Motor).
Merke
class Unter(Ober):erbt alles von der Oberklasse- Methoden lassen sich überschreiben;
super()ruft die Oberklasse auf - Polymorphie: gleicher Aufruf, je nach Objekt anderes Verhalten
isinstance,issubclass,__mro__für Typfragen- Abstrakte Klassen mit
ABCund@abstractmethod - “hat ein” bedeutet Komposition, “ist ein” bedeutet Vererbung
Übungsaufgabe
Erstelle eine Oberklasse Form mit flaeche() und zwei Unterklassen Rechteck und Kreis. Gib in einer Schleife alle Flächen aus.
Quiz zur Selbstkontrolle
Wozu dient super()?
- Um Methoden der Oberklasse aufzurufen (richtig)
- Um eine Klasse zu löschen
- Um Objekte zu kopieren
- Um Variablen global zu machen
Was bedeutet Polymorphie?
- Derselbe Aufruf verhält sich je nach Objekt anders (richtig)
- Eine Klasse hat mehrere Konstruktoren
- Objekte können kopiert werden
- Klassen können gelöscht werden
Welche Beziehung beschreibt Komposition?
- “hat ein” (ein Objekt enthält ein anderes) (richtig)
- “ist ein”
- “erbt von”
- “ist gleich”
Weiter im Kurs
Zurück: Klassen und Objekte
Weiter: Spezielle Methoden (Dunder)
Alle Kapitel: Python im Überblick