Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
super(), gdy nadpisanie ma rozszerzyć, a nie zastąpić zachowanie klasy nadrzędnej.Dziedziczenie tworzy relację między typami. Polimorfizm (polymorphism) pozwala kodowi pracować z różnymi obiektami przez wspólną nazwę metody. Podklasa nadpisuje (override) metodę, definiując metodę o tej samej nazwie. Wywołanie obj.summary() używa implementacji należącej do tego obiektu.
To odpowiednik nadpisywania metod z Javy lub C# w Pythonie, ale nie musisz dodawać @Override, żeby działało. Zachowaj te same oczekiwane parametry i zachowanie zwracanej wartości, aby wywołujący nie musieli znać konkretnej podklasy.
Użyj super().method(), gdy klasa nadrzędna już wykonuje użyteczną pracę, którą chcesz zachować. Pętla może wtedy przetwarzać różne obiekty przez ten sam interfejs, zamiast sprawdzać ich typy i duplikować gałęzie.
Podklasa zwraca wyspecjalizowaną etykietę, gdy wywołana zostaje ta sama metoda.
class Device:
def status(self):
return "unknown"
class Router(Device):
def status(self):
return "online"
print(Device().status())
print(Router().status())Wynik:
unknown
onlinePętla nie musi znać dokładnej podklasy każdego elementu.
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())Wynik:
warning
error
generalsuper() ponownie używa komunikatu bazowego, zanim doda informacje podklasy.
class Build:
def summary(self):
return "Build complete"
class VerifiedBuild(Build):
def summary(self):
return f"{super().summary()} | tests passed"
print(VerifiedBuild().summary())Wynik:
Build complete | tests passedKażda klasa udostępnia metodę label(), więc wywołujący może traktować je jednolicie.
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()))Wynik:
Shipping: express| Pojęcie | Kluczowa idea |
|---|---|
| Nadpisanie metody | Podklasa definiuje tę samą nazwę metody |
| Polimorfizm | Wywołanie tej samej metody na obiektach różnych typów |
super().method() | Ponowne użycie implementacji klasy nadrzędnej |
| Wspólny interfejs | Wywołujący nie musi rozgałęziać kodu według typu każdej podklasy |