Rozdział 14 · Tworzenie rzeczywistych obiektów

Dziedzictwo

Kiedy jedna klasa jest bardziej szczególnym przypadkiem innej, dziedziczenie pozwala nie przepisywać ogólnego zachowania od nowa.

Zbuduj klasę na podstawie istniejącej

Jeśli dwie klasy mają wiele wspólnego, ale jedna jest pojęciem bardziej ogólnym, a druga jego szczególnym przypadkiem, relacja między nimi — IS-A („Kot to zwierzę” dziedziczenie:

nasledovanie.py
class Zhivotnoe:
    def __init__(self, klichka):
        self.klichka = klichka

    def predstavitsya(self):
        print(f"Ja {self.klichka}")


class Sobaka(Zhivotnoe):     # Sobaka — to Zhivotnoe
    def zvuk(self):
        return „Hau!”


class Koshka(Zhivotnoe):     #Koshka też jest Zhivotnoe
    def zvuk(self):
        return „Miau!”


rex = Sobaka(„Rex”)
rex.predstavitsya()    # odziedziczone po Zhivotnoe — działa bez nadpisywania
print(rex.zvuk())       # Twoja własna, zdefiniowana w Sobaka
Zhivotnoe
Sobaka
Koshka
Sobaka i Koshka dziedziczą po Zhivotnoe – powszechne zachowanie (predstavitsya) nie musi być zapisywane dwa razy
SobakaZhivotnoeIS-A
IS-A: otwarty trójkąt wskazuje rodzica
Dziedziczenie jest ponownym wykorzystaniem, a nie obowiązkiem
Sobaka dostaje predstavitsya() za DARMO, bez przepisywania czegokolwiek — o to właśnie chodzi. Ale dziedziczenie jest uzasadnione tylko wtedy, gdy relacja jest rzeczywista IS-A. Jeśli chcesz odziedziczyć klasę tylko po to, by „pożyczyć”
Debug Lab 8: Zapomniałem zadzwonić do super().__init__()
propushchennyj_super.py
class Zhivotnoe:
    def __init__(self, klichka):
        self.klichka = klichka


class Sobaka(Zhivotnoe):
    def __init__(self, klichka, poroda):
        self.poroda = poroda     #klichka Zhivotnoe nie skonfigurowanych!

rex = Sobaka(„Rex”, „Kundel”)
print(rex.klichka)
Traceback (most recent call last):
  File "propushchennyj_super.py", line 9, in 
    print(rex.klichka)
AttributeError: 'Sobaka' object has no attribute 'klichka'
Co widać na ekranie

Kiedy klasa potomna definiuje WŁASNĄ __init__całkowicie ZASTĘPUJE rodzicielskie __init__ - Kod konfiguracji atrybutu nadrzędnego nie działa już samodzielnie. Aby uzyskać oba, dziecko __init__ musi wyraźnie zadzwonić do rodzica — zobaczmy jak w sekcji 14.16.

Poprawiony kod
s_super.py
class Sobaka(Zhivotnoe):
    def __init__(self, klichka, poroda):
        super().__init__(klichka)   # Najpierw skonfiguruj część rodzica
        self.poroda = poroda
Praktyka: Dziedzictwo
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →