Dziedziczenie

1. Podstawy dziedziczenia

1.1 Klasa bazowa i pochodna

Dziedziczenie pozwala tworzyć nowe klasy (klasy pochodne), które przechwytują właściwości i metody klasy bazowej, a jednocześnie mogą dodawać własne.

  • Klasa bazowa (parent / superclass) – klasa, której właściwości dziedziczy klasa pochodna.
  • Klasa pochodna (child / subclass) – klasa, która dziedziczy po klasie bazowej.

Przykład:

Wyjaśnienie:

  • Pies dziedziczy wszystkie metody i atrybuty klasy Zwierze.
  • Dzięki super().__init__(gatunek) konstruktor klasy bazowej jest wywoływany, co pozwala ustawić atrybut gatunek.
  • Klasa pochodna może mieć dodatkowe atrybuty (np. imie).

1.2 Konstruktor w dziedziczeniu

  • Jeśli klasa pochodna nie wywoła jawnie konstruktora klasy bazowej, konstruktor bazowy nie zostanie automatycznie uruchomiony.
  • super().__init__(...) pozwala przekazać argumenty do konstruktora klasy bazowej i zapewnić poprawne zainicjalizowanie wszystkich atrybutów.

Przykład bez super() – problem:

Dlatego zawsze warto wywołać konstruktor klasy bazowej:


2. Nadpisywanie metod (Overriding)

Nadpisywanie metod pozwala klasie pochodnej zmienić lub rozszerzyć funkcjonalność metod klasy bazowej.

2.1 Podstawowy przykład

Metoda dzwiek w klasie Pies nadpisuje metodę z klasy Zwierze.


2.2 Rozszerzanie funkcjonalności klasy bazowej

Często chcemy rozszerzyć, a nie całkowicie zastąpić metodę klasy bazowej. W tym celu używa się super():

Wyjaśnienie:

  • super().przedstaw_sie() wywołuje metodę z klasy bazowej.
  • Następnie metoda klasy pochodnej dodaje własną logikę, zachowując funkcjonalność klasy bazowej.

3. Podsumowanie – dziedziczenie i nadpisywanie

  • Dziedziczenie pozwala tworzyć klasy pochodne, które odziedziczą atrybuty i metody klasy bazowej.
  • Konstruktor klasy bazowej warto wywołać w klasie pochodnej przez super().__init__(), aby poprawnie zainicjalizować obiekt.
  • Nadpisywanie metod (overriding) umożliwia zmianę lub rozszerzenie zachowania odziedziczonych metod.
  • super() jest narzędziem do odwoływania się do klasy bazowej w klasie pochodnej, co pozwala zachować i rozbudować funkcjonalność.