Objekt je něco v paměti programu, co obsahuje data i funkce. Tzn. data i funkce jsou v objektově orientovaném programování tříděny na základě toho, k čemu logicky patří.
Pozn.: v Pythonu je objekt skoro všechno.
Třída je předpis na vytvoření objektu. Definujeme-li třídu, zatím nevznikl žádný objekt. Podle jedné třídy pak můžeme vyrobit objektů několik podle potřeby.
class MojeTrida: def VypisAbecedu(self): print("Abcdefgh")To je třída, která obsahuje jednu funkci.
NovyObjekt = MojeTrida()Co by se stalo, kdyby tam závorky nebyly? Nyní můžeme používat funkci (tzv. metodu) objektu:
NovyObjekt.VypisAbecedu()
class MojeTrida: def VypisAbeceduSVarovanim(self): print("Pozor, bude prozrazeno 8 písmen abecedy!") self.VypisAbecedu() def VypisAbecedu(self): print("Abcdefgh") MojeTrida().VypisAbeceduSVarovanim()
class MojeTrida: def __init__(self, abeceda= "abcdefgh"): print("Připravuji si text k vypsání") self.abeceda = abeceda def VypisAbecedu(self): print("Abcdefgh") NovyObjekt = PrazdnaTrida() NovyObjekt.Promenna = 42 print(NovyObjekt.Promenna)
Dědičnost tříd omezuje nutnost psát stejný kód vícekrát pro podobné třídy.
Z rodičovské třídy se vezmou všechny její funkce a zkopírují se do nové třídy. V definici nové třídy pak můžeme přidat nové funkce nebo některé ze stávajících funkcí nahradit.
class MojeTrida: def __init__(self, abeceda= "abcdefgh"): print("Připravuji si text k vypsání") self.abeceda = abeceda def VypisAbecedu(self): self.abeceda class MojeTridaBezpecna(MojeTrida): def __init__(self, abeceda= "abcdefgh"): print("A já si tady nic nepřipravuju") ## POZOR, tohle nefunguje, jak by mělo!! def VypisAbecedu(self): print("Abcdefgh")ÚKOL: Jak to udělat, když budeme chtít i u třídy MojeTridaBezpecna, ve funkci __init__() vypsat, že text již byl připraven? Pozn.: dědit jde i od více tříd současně (záleží na pořadí).
isinstance(obj, MojeTridaBezpecna) To platí i pro toto, zkuste si toPozn. stále můžete používat univerzální zabudovanou funkci type()isinstance(obj, MojeTrida)
class a: """Toto je nějaký docstring, tahle třída nedělá vůbec nic.""" passZískat ho jde jako speciální proměnnou, která -- pozor -- tentokrát patří třídě, nikoli objektům: a.__doc__