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

Komposition statt Vererbung

Nach dieser Lektion: Ich kann Komposition statt Vererbung wählen und den Grund nennen.

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

Ein Auto hat einen Motor, es ist keiner

Komposition bedeutet, dass ein Objekt andere Objekte als Teile besitzt und ihnen Arbeit überlässt. Damit tauschen Sie ein Teil aus, ohne die Klasse umzubauen.

Ein Autohersteller baut Benziner und Elektroautos. Soll er für jede Mischung aus Motor und Karosserie eine eigene Klasse schreiben? Mit Teilen bleibt es bei wenigen kleinen Klassen.

Am Ende dieser Lektion

Notiz

Ich kann Komposition statt Vererbung wählen und den Grund nennen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Kompositionein Objekt hält andere Objekte als Teile
ist-eindie Beziehung der Vererbungein Lastenrad ist ein Rad
hat-eindie Beziehung der Kompositionein Auto hat einen Motor
Delegierendie Arbeit an ein Teilobjekt weitergeben
Kopplungwie stark eine Klasse von einer anderen abhängt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Bei Komposition gilt der Satz „hat ein“

Vererbung drückt „ist ein“ aus, Komposition drückt „hat ein“ aus. Das Auto hat einen Motor. Ein Auto ist kein Motor.

Im Code steht das Teil als Attribut: self.motor. Die Methode reichweite_km des Autos delegiert, sie gibt die Frage an den Motor weiter und liefert dessen Antwort.

Ein Auto mit austauschbarem Motor

Code: python
class Benzinmotor:
    def reichweite_km(self, menge):
        return menge * 15

class Elektromotor:
    def reichweite_km(self, menge):
        return menge * 6

class Auto:
    def __init__(self, motor, menge):
        self.motor = motor
        self.menge = menge

    def reichweite_km(self):
        return self.motor.reichweite_km(self.menge)

    def motor_wechseln(self, neuer_motor):
        self.motor = neuer_motor

auto = Auto(Benzinmotor(), 40)
print(auto.reichweite_km())
auto.motor_wechseln(Elektromotor())
print(auto.reichweite_km())
# Ändern Sie die Menge 40 in 50 und starten Sie noch einmal.

Wie viele Klassen braucht welcher Weg

AntriebeKarosserienMit VererbungMit Komposition
236 Klassen, eine je Mischung5 Klassen: 2 plus 3
3412 Klassen7 Klassen: 3 plus 4
4520 Klassen9 Klassen: 4 plus 5

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein häufiger Fehler

Warnung

Viele halten Vererbung für die einzige Art, Code zu teilen, und schreiben ElektroAuto(Benzinauto). Ein Elektroauto ist aber kein Sonderfall eines Benziners. Setzen Sie stattdessen den Motor als Teil ein und wechseln Sie ihn bei Bedarf.

Ein Teil lässt sich zur Laufzeit austauschen

Eine Unterklasse legen Sie beim Schreiben des Codes fest. Ein Teil dagegen kann sich ändern, während das Programm läuft: auto.motor_wechseln(Elektromotor()).

Dafür müssen die Teile dieselbe Methode anbieten, hier reichweite_km. Das Auto fragt nur nach dieser Methode und kennt nicht die Klasse des Teils. Das hält die Kopplung niedrig.

Ein Leuchtmittel im Lab austauschen

Im Lab bauen Sie eine Lampe, die ein Leuchtmittel hat. Die Glühbirne zieht 60 Watt, die LED 8 Watt. Die Lampe rechnet den Verbrauch in Wattstunden: Watt mal Stunden.

Bei fünf Stunden Betrieb erwarten Sie zuerst 300, nach dem Tausch der Birne gegen die LED 40.

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 Lampe mit zwei Leuchtmitteln schreiben

Befehl
printf 'class Gluehbirne:\n    def watt(self):\n        return 60\n\nclass Led:\n    def watt(self):\n        return 8\n\nclass Lampe:\n    def __init__(self, leuchtmittel):\n        self.leuchtmittel = leuchtmittel\n\n    def verbrauch_wh(self, stunden):\n        return self.leuchtmittel.watt() * stunden\n\nlampe = Lampe(Gluehbirne())\nprint(lampe.verbrauch_wh(5))\nlampe.leuchtmittel = Led()\nprint(lampe.verbrauch_wh(5))\n' > lampe.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 lampe.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.

Die Lampe blieb dieselbe, nur das Teil wechselte

Die Klasse Lampe kennt weder die Glühbirne noch die LED. Sie ruft nur watt() auf. Ein drittes Leuchtmittel mit einer eigenen Methode watt passt ohne eine Änderung an der Lampe.

Mit Vererbung wäre dafür eine Unterklasse LedLampe nötig gewesen, und der Tausch zur Laufzeit ginge nicht.

Ü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.