Erklärung zur Lektion
Nach dieser Lektion kannst du:
super() verwenden, wenn eine Überschreibung das Verhalten der Elternklasse erweitern statt ersetzen soll.Vererbung schafft eine Beziehung zwischen Typen. Polymorphie (Polymorphism) lässt Code über einen gemeinsamen Methodennamen mit verschiedenen Objekten arbeiten. Eine Unterklasse überschreibt (override) eine Methode, indem sie eine Methode mit demselben Namen definiert. Der Aufruf obj.summary() verwendet die Implementierung, die zu diesem Objekt gehört.
Das ist das Python-Gegenstück zum Überschreiben von Methoden in Java oder C#, aber du musst kein @Override hinzufügen, damit es funktioniert. Behalte dieselben erwarteten Parameter und dasselbe Rückgabeverhalten bei, damit Aufrufer die konkrete Unterklasse nicht kennen müssen.
Verwende super().method(), wenn die Elternklasse bereits nützliche Arbeit leistet, die du bewahren willst. Eine Schleife kann dann verschiedene Objekte über dieselbe Schnittstelle verarbeiten, statt ihre Typen zu prüfen und Zweige zu duplizieren.
Eine Unterklasse gibt eine spezialisierte Bezeichnung zurück, wenn dieselbe Methode aufgerufen wird.
class Device:
def status(self):
return "unknown"
class Router(Device):
def status(self):
return "online"
print(Device().status())
print(Router().status())Ausgabe:
unknown
onlineDie Schleife muss die genaue Unterklasse jedes Elements nicht kennen.
class Alert:
def level(self):
return "general"
class WarningAlert(Alert):
def level(self):
return "warning"
class ErrorAlert(Alert):
def level(self):
return "error"
alerts = [WarningAlert(), ErrorAlert(), Alert()]
for alert in alerts:
print(alert.level())Ausgabe:
warning
error
generalsuper() verwendet die Basisnachricht wieder, bevor es Informationen der Unterklasse hinzufügt.
class Build:
def summary(self):
return "Build complete"
class VerifiedBuild(Build):
def summary(self):
return f"{super().summary()} | tests passed"
print(VerifiedBuild().summary())Ausgabe:
Build complete | tests passedJede Klasse stellt eine Methode label() bereit, sodass der Aufrufer sie einheitlich behandeln kann.
class Transport:
def label(self):
return "standard"
class ExpressTransport(Transport):
def label(self):
return "express"
def describe(transport):
return f"Shipping: {transport.label()}"
print(describe(ExpressTransport()))Ausgabe:
Shipping: express| Konzept | Kerngedanke |
|---|---|
| Methode überschreiben | Die Unterklasse definiert denselben Methodennamen |
| Polymorphie | Dieselbe Methode für verschiedene Objekttypen aufrufen |
super().method() | Die Implementierung der Elternklasse wiederverwenden |
| Gemeinsame Schnittstelle | Der Aufrufer muss nicht nach jedem Unterklassentyp verzweigen |