Ein Verleih mit drei Arten von Fahrrädern
Vererbung bedeutet, dass eine Klasse Attribute und Methoden einer anderen Klasse übernimmt. So schreiben Sie gemeinsamen Code nur einmal und ergänzen nur, was anders ist.
Der Fahrradverleih einer Hochschule hat normale Räder, Lastenräder und E-Bikes. Alle haben eine Nummer und einen Tagespreis. Nur der Preis rechnet sich verschieden.
Am Ende dieser Lektion
Notiz
Ich kann Code durch Vererbung wiederverwenden und Polymorphie nutzen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Vererbung | eine Klasse übernimmt alles von einer anderen | |
| Basisklasse | die Klasse, von der geerbt wird | |
| Unterklasse | die Klasse, die erbt und etwas ergänzt | class Lastenrad(Mietrad): |
| Überschreiben | eine geerbte Methode durch eine eigene ersetzen | |
| Polymorphie | derselbe Aufruf tut je nach Objekt etwas anderes | |
| super() | der Zugriff auf die Methode der Basisklasse |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Unterklasse erbt alles von ihrer Basisklasse
Sie schreiben den Namen der Basisklasse in Klammern hinter den Namen der Unterklasse: class Lastenrad(Mietrad):. Damit hat Lastenrad ohne weitere Zeile die Attribute und Methoden von Mietrad.
Die Faustregel lautet: Die Unterklasse ist ein Sonderfall der Basisklasse. Ein Lastenrad ist ein Mietrad.
Drei Räder, ein gemeinsamer Aufruf
class Mietrad:
def __init__(self, nummer):
self.nummer = nummer
def tagespreis_cent(self):
return 500
def beschreibung(self):
preis = str(self.tagespreis_cent())
return "Rad " + str(self.nummer) + ": " + preis + " Cent am Tag"
class Lastenrad(Mietrad):
def tagespreis_cent(self):
return 900
class EBike(Mietrad):
def tagespreis_cent(self):
return super().tagespreis_cent() + 700
raeder = [Mietrad(1), Lastenrad(2), EBike(3)]
for rad in raeder:
print(rad.beschreibung())
# Ändern Sie 900 in 1000 und starten Sie noch einmal.
Welche Klasse liefert welchen Teil
| Klasse | tagespreis_cent() | beschreibung() | Herkunft |
|---|---|---|---|
| Mietrad | 500 | eigene Methode | Basisklasse |
| Lastenrad | 900 | von Mietrad geerbt | überschreibt den Preis |
| EBike | 1200 | von Mietrad geerbt | überschreibt den Preis und nutzt super() |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Überschreiben ersetzt eine geerbte Methode
Steht in der Unterklasse eine Methode mit demselben Namen, gewinnt sie. Python sucht zuerst in der Unterklasse, dann in der Basisklasse.
Mit super().methode() rufen Sie trotzdem die Methode der Basisklasse auf und bauen darauf auf. So ergänzt das EBike den Basispreis um 700 Cent, statt die Zahl 500 noch einmal zu schreiben.
Polymorphie: ein Aufruf, viele Antworten
Die Schleife in der Demo ruft für jedes Rad beschreibung() auf. Sie muss die Art des Rads nicht kennen und prüft nichts mit if.
Jedes Objekt antwortet mit seiner eigenen Methode. Das ist Polymorphie, griechisch für „viele Gestalten“. Ein neues Rad mit eigenem Preis lässt sich dazustecken, ohne die Schleife zu ändern.
Die Beziehung im Lab prüfen
Python kann fragen, ob ein Objekt zu einer Klasse gehört. isinstance(objekt, Klasse) ist wahr, wenn das Objekt zur Klasse oder zu einer Unterklasse gehört. issubclass(A, B) fragt dasselbe für zwei Klassen.
Die Datei raeder.py hat drei Klassen. Erwartet werden die Zeilen Mietrad 500, Lastenrad 900, Kinderrad 500, dann True und False.
Den Ordner anlegen
mkdir -p ~/oop-laborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Hineingehen
cd ~/oop-laborHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Klassenfamilie schreiben
printf 'class Mietrad:\n def tagespreis_cent(self):\n return 500\n\nclass Lastenrad(Mietrad):\n def tagespreis_cent(self):\n return 900\n\nclass Kinderrad(Mietrad):\n pass\n\nfor rad in [Mietrad(), Lastenrad(), Kinderrad()]:\n print(type(rad).__name__, rad.tagespreis_cent())\nprint(isinstance(Kinderrad(), Mietrad))\nprint(issubclass(Lastenrad, Kinderrad))\n' > raeder.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Programm starten
python3 raeder.pyHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Kinderrad erbt den Preis
Das Kinderrad hat nur pass als Inhalt und liefert trotzdem 500. Es erbt den Preis von Mietrad.
Das letzte False zeigt: Ein Lastenrad ist kein Sonderfall des Kinderrads. Die beiden Klassen sind Geschwister, keine Eltern und Kinder.
Ein häufiger Fehler
Warnung
Viele erben nur, um Code zu sparen, auch wenn der Satz „ist ein“ nicht stimmt. Ein Fahrradschloss ist kein Fahrrad, obwohl beide eine Nummer haben. Prüfen Sie vor jeder Vererbung den Satz „Die Unterklasse ist ein Sonderfall der Basisklasse“.