super() i procedura rozwiązywania rozwiązań
super() pozwala klasie podrzędnej korzystać z metody rodzica z samego nadpisywania — zamiast przepisywać ją od nowa.
super(): dzwonić do rodzica, a nie go zastępować
super() daje dostęp do metod klasy nadrzędnej OD WEWNĄTRZ
metoda nadpisana — zwykle po to, by UZUPEŁNIĆ zachowanie rodzica, a nie je zastąpić
Całkowicie:
class Zhivotnoe:
def __init__(self, klichka):
self.klichka = klichka
class Sobaka(Zhivotnoe):
def __init__(self, klichka, poroda):
super().__init__(klichka) # wykonuje Zhivotnoe.__init__(self klichka)
self.poroda = poroda # następnie dodaje swoje
rex = Sobaka(„Rex”, „Kundel”)
print(rex.klichka, rex.poroda) # Rex Mongrel – Oba atrybuty są obecne
super() zwraca specjalny pośredni obiekt (proxy), który potrafi znajdować metody RODZICA dla BIEŻĄCEGO self — self pozostaje obiektem Sobakanie zamienia się w Zhivotnoe. Po prostu tym razem poszukiwanie metody się nie zaczyna Sobaka, ale o poziom wyżej.Kolejność rozwiązywania metod (MRO)
W przypadku normalnego pojedynczego dziedziczenia procedura znalezienia metody jest prosta i przewidywalna:
najpierw klasa obiektu, potem jej rodzic, potem rodzic rodzica — i tak dalej
object, podstawowa klasa dla wszystkich klas w Python:
class Sobaka(Zhivotnoe):
def __init__(self, klichka, poroda):
self.poroda = poroda
print(f"Rasa: {self.poroda}, przezwyk: {self.klichka}") # klichka jeszcze nie!
super().__init__(klichka)
Traceback (most recent call last):
print(f"Порода: {self.poroda}, кличка: {self.klichka}")
AttributeError: 'Sobaka' object has no attribute 'klichka'
super().__init__(klichka) powinno być PO ZA linijką, która już próbuje przeczytać self.klichka jest już rodzicem __init__ jeszcze nie wykonano, atrybut jeszcze nie utworzono. Kolejność wywołań wewnątrz __init__ wykonywana jest ściśle od góry do dołu, jak w każdej innej funkcji.
class Sobaka(Zhivotnoe):
def __init__(self, klichka, poroda):
super().__init__(klichka) # Rodzic na pierwszym miejscu
self.poroda = poroda
print(f"Rasa: {self.poroda}, przezwyk: {self.klichka}")