0Pricing
Python Academy · Lekcja

Przesłanianie metod i super()

Proszę przesłaniać metody klasy nadrzędnej i wywoływać je za pomocą super().

Przesłanianie metod i super() to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Wprowadzenie

Przesłanianie metod pozwala klasom potomnym dostosowywać odziedziczone zachowanie. super() umożliwia wywołanie oryginalnej implementacji.

Podstawy przesłaniania

Zdefiniuj w klasie potomnej metodę o tej samej nazwie, aby zastąpić wersję z klasy nadrzędnej dla wszystkich instancji klasy potomnej.
class Greeter:
    def greet(self): return 'Hello'
class FormalGreeter(Greeter):
    def greet(self): return 'Good day'
print(FormalGreeter().greet())

super() w przesłonięciach

super().greet() wewnątrz klasy potomnej wywołuje wersję z klasy nadrzędnej. Jest to przydatne do rozszerzania zachowania, a nie całkowitego jego zastępowania.
class Logger:
    def log(self, msg): print(f'[LOG] {msg}')
class TimedLogger(Logger):
    def log(self, msg):
        import time
        super().log(f'{time.time():.0f}: {msg}')
TimedLogger().log('test')

super() w __init__

W __init__ klasy potomnej należy zawsze wywołać super().__init__(), aby uruchomić inicjalizację klasy nadrzędnej.
class Animal:
    def __init__(self, name): self.name = name
class Cat(Animal):
    def __init__(self, name, indoor):
        super().__init__(name)
        self.indoor = indoor
cat = Cat('Whiskers', True)
print(cat.name, cat.indoor)

super() z argumentami

super(ChildClass, self) to jawna forma zapisu (w stylu Pythona 2). Python 3 w większości przypadków pozwala używać super() bez argumentów.
class A:
    def greet(self): return 'A'
class B(A):
    def greet(self): return super().greet() + 'B'
class C(B):
    def greet(self): return super().greet() + 'C'
print(C().greet())

Kooperatywne dziedziczenie

W przypadku wielokrotnego dziedziczenia super() postępuje zgodnie z MRO. Każda klasa wywołująca super() zapewnia inicjalizację wszystkich klas w łańcuchu.
class A:
    def __init__(self): print('A init')
class B(A):
    def __init__(self): super().__init__(); print('B init')
class C(A):
    def __init__(self): super().__init__(); print('C init')
class D(B, C):
    def __init__(self): super().__init__(); print('D init')
D()

Przesłanianie __str__

Przesłoń __str__ w klasie potomnej, aby dostosować sposób wyświetlania jej instancji.
class Animal:
    def __init__(self, name): self.name = name
    def __str__(self): return f'Animal: {self.name}'
class Dog(Animal):
    def __str__(self): return f'Dog: {self.name}'
print(Dog('Rex'))

Wzorzec Template Method

Klasa nadrzędna definiuje szkielet algorytmu, a klasa potomna uzupełnia poszczególne kroki, przesłaniając wybrane metody.
class DataProcessor:
    def process(self):
        data = self.load()
        return self.transform(data)
    def load(self): return [1,2,3]
    def transform(self, d): return d
class Doubler(DataProcessor):
    def transform(self, d): return [x*2 for x in d]
print(Doubler().process())

Wywoływanie metody klasy siostrzanej

Dzięki super() i prawidłowemu MRO można wywołać metodę klasy siostrzanej w przypadku wielokrotnego dziedziczenia — jest to kooperatywne użycie super().
class A:
    def hello(self): print('A')
class B(A):
    def hello(self): super().hello(); print('B')
class C(A):
    def hello(self): super().hello(); print('C')
class D(B,C):
    def hello(self): super().hello(); print('D')
D().hello()

__init_subclass__

__init_subclass__ jest wywoływana za każdym razem, gdy klasa jest rozszerzana o klasę potomną. Jest przydatna we wzorcach rejestrowania wtyczek.
class Plugin:
    registry = []
    def __init_subclass__(cls, **kw):
        super().__init_subclass__(**kw)
        Plugin.registry.append(cls)
class A(Plugin): pass
class B(Plugin): pass
print([c.__name__ for c in Plugin.registry])

Kiedy NIE przesłaniać

Nie należy przesłaniać metody, jeśli nie ma potrzeby zmiany jej zachowania. Niepotrzebne przesłonięcia zwiększają koszty utrzymania kodu. W przypadku niezwiązanych zachowań lepiej użyć kompozycji.
# Good: only override what's needed
class Dog(Animal):
    def speak(self): return 'Woof'
    # No need to override __init__ if parent's is fine
print('override guidance')

Szybkie sprawdzenie

Do czego odnosi się super() (bez argumentów) wewnątrz metody w Pythonie 3?

Podsumowanie

Przesłaniaj metody, definiując je ponownie w klasie potomnej. super().method() wywołuje wersję z klasy nadrzędnej. super().__init__() inicjalizuje klasę nadrzędną. Kooperatywne użycie super() przebiega zgodnie z kolejnością MRO.

Kontynuuj

Doskonale sobie radzisz! Proszę kontynuować, aby opanować następne zagadnienie.

Często zadawane pytania

Czy lekcja „Przesłanianie metod i super()” jest bezpłatna?

Tak — pełny tekst „Przesłanianie metod i super()” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Przesłanianie metod i super()”?

Proszę przesłaniać metody klasy nadrzędnej i wywoływać je za pomocą super(). Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Przesłanianie metod i super()”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dziedziczenie pojedyncze
  2. Przesłanianie metod i super()
  3. Dziedziczenie wielokrotne i MRO
  4. Polimorfizm i kaczego typowanie
← Powrót do Python Academy