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í 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 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.