Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Vererbung und Polymorphie

Nach dieser Lektion: Ich kann Code durch Vererbung wiederverwenden und Polymorphie nutzen.

Lektion, 60 Min.4 BefehleLab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

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

BegriffWas er bedeutetBeispiel
Vererbungeine Klasse übernimmt alles von einer anderen
Basisklassedie Klasse, von der geerbt wird
Unterklassedie Klasse, die erbt und etwas ergänztclass Lastenrad(Mietrad):
Überschreibeneine geerbte Methode durch eine eigene ersetzen
Polymorphiederselbe 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

Code: python
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

Klassetagespreis_cent()beschreibung()Herkunft
Mietrad500eigene MethodeBasisklasse
Lastenrad900von Mietrad geerbtüberschreibt den Preis
EBike1200von 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

Befehl
mkdir -p ~/oop-labor

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Hineingehen

Befehl
cd ~/oop-labor

Hier 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

Befehl
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.py

Hier 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

Befehl
python3 raeder.py

Hier 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“.

Über dieses Lab und seinen Quellcode: Lab „Linux im Alltag“: die dreißig Befehle, die Entwickelnde auswendig tippen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.