Wyjaśnienie lekcji
super()Po tej lekcji będziesz potrafić:
super().__init__(...), aby zainicjalizować odziedziczony stan instancji przed dodaniem nowych atrybutów.super().method(...) zamiast kopiować jej logikę.Dziedziczenie (inheritance) pozwala jednej klasie ponownie wykorzystać zachowanie innej. Umieść klasę nadrzędną w nawiasach:
class Job:
pass
class SpecialJob(Job):
passPodklasa dziedziczy dostępne metody i atrybuty po klasie nadrzędnej. Może też definiować własne atrybuty i metody. Gdy podklasa definiuje własne __init__, inicjalizator klasy nadrzędnej nie jest wywoływany automatycznie. Wywołaj super().__init__(...), aby ustanowić atrybuty klasy nadrzędnej przed dodaniem nowych.
Pomocnik super() pozwala też nadpisującej metodzie instancji wywołać implementację klasy nadrzędnej. Pozwala to uniknąć powielania działającego zachowania bazowego. Następna lekcja omówi szczegółowo nadpisywanie metod i polimorfizm; na razie używaj nadpisania tylko wtedy, gdy ma rozszerzyć to, co klasa nadrzędna już robi.
Podklasa może wywołać metodę klasy nadrzędnej, nawet jeśli sama jej nie definiuje.
class Device:
def __init__(self, identifier):
self.identifier = identifier
def label(self):
return f"Device {self.identifier}"
class Laptop(Device):
pass
print(Laptop("A14").label())Wynik:
Device A14Laptop odziedziczył metodę label() po Device.
Użyj super().__init__, aby zachować nienaruszoną konfigurację klasy nadrzędnej.
class Account:
def __init__(self, owner):
self.owner = owner
class PremiumAccount(Account):
def __init__(self, owner, credits):
super().__init__(owner)
self.credits = credits
print(f"{PremiumAccount('Noor', 50).owner}: premium")Wynik:
Noor: premiumKlasa nadrzędna tworzy owner; klasa potomna dodaje credits.
super()Klasa potomna może użyć wyniku klasy nadrzędnej i dołączyć własne informacje.
class Message:
def __init__(self, text):
self.text = text
def summary(self):
return self.text
class UrgentMessage(Message):
def summary(self):
return f"URGENT: {super().summary()}"
print(UrgentMessage("Restart required").summary())Wynik:
URGENT: Restart requiredNadpisana metoda wywołuje metodę klasy nadrzędnej, zamiast przepisywać jej zachowanie.
Odziedziczone metody można wywoływać na różnych podklasach lub instancjach klasy nadrzędnej.
class Counter:
def __init__(self, value):
self.value = value
def double(self):
return self.value * 2
class LabeledCounter(Counter):
def __init__(self, value, label):
super().__init__(value)
self.label = label
print(LabeledCounter(7, "items").double())Wynik:
14Podklasa dodaje label, nie tracąc metody double() klasy nadrzędnej.
| Cel | Python |
|---|---|
| Dziedziczenie po klasie nadrzędnej | class Child(Parent): |
| Uruchomienie inicjalizatora klasy nadrzędnej | super().__init__(...) |
| Rozszerzenie metody klasy nadrzędnej | super().method(...) |
| Pozostawienie zachowania klasy nadrzędnej bez zmian | Nie definiuj tej metody ponownie |
__init__ w klasie potomnej, ale zapomnienie o inicjalizacji atrybutów klasy nadrzędnej.self do super().__init__.super().