Studijní materiály
EXTRA Kontakt

Dědičnost a polymorfismus

Dědičnost

Dědičnost umožňuje jedné třídě (potomkovi) zdědit atributy a metody od jiné třídy (rodiče). To umožňuje znovupoužití kódu a vytváření hierarchií tříd.

class Zvire:
    def __init__(self, druh):
        self.druh = druh

    def zvuk(self):
        pass

class Pes(Zvire):
    def __init__(self, jmeno, vek):
        super().__init__("Pes")
        self.jmeno = jmeno
        self.vek = vek

    def zvuk(self):
        return "Haf haf!"

V tomto příkladu třída Pes dědí od třídy Zvire. Metoda zvuk je přepsána, aby vracela specifický zvuk pro psa.

Použití super() v metodě __init__ zajišťuje, že konstruktor rodičovské třídy Zvire je také volán.

Zapouzdření

Zapouzdření v OOP se týká ukrytí vnitřních detailů objektu a poskytování veřejných rozhraní pro interakci s daty. V Pythonu se toto dosahuje pomocí konvence, kdy se proměnné, které by měly být chráněny, začínají podtržítkem.

class BankovniUcet:
    def __init__(self, majitel, zustatek):
        self.majitel = majitel
        self.__zustatek = zustatek

    def vloz_penez(self, castka):
        if castka > 0:
            self.__zustatek += castka

    def vyber_penez(self, castka):
        if castka <= self.__zustatek:
            self.__zustatek -= castka

    def zobraz_zustatek(self):
        return self.__zustatek

V tomto příkladu je proměnná __zustatek zapouzdřena a není přímo přístupná zvenčí. Přístup k ní je umožněn pouze prostřednictvím veřejných metod.

Polymorfismus

Polymorfismus umožňuje volání stejné metody na objektech různých tříd, přičemž každá třída implementuje tuto metodu podle své potřeby. To je klíčový princip v OOP, který podporuje flexibilitu a rozšiřitelnost kódu.

class Kocka(Zvire):
    def zvuk(self):
        return "Mňau!"

class Krava(Zvire):
    def zvuk(self):
        return "Múú!"

V tomto příkladu máme třídy Kocka a Krava, které obě dědí od třídy Zvire a implementují metodu zvuk. Polymorfismus nám umožňuje volat tuto metodu na jakékoli instanci třídy Zvire, aniž bychom museli vědět, jaká konkrétní třída byla použita.