Seminář programování v Pythonu na PORGu - lekce 7


Omluva za 1) neměnitelnost řetězce; 2) neexistenci soukromých proměnných; 3) neudělení opravených testů Markétě a Davidovi.

Objekty a třídy

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.

Minimalistická definice třídy

class MojeTrida:
    def VypisAbecedu(self):
        print("Abcdefgh")
To je třída, která obsahuje jednu funkci.

Vytvoření objektu

Můžeme podle ní vyrobit objekt, který umí vypsat kus abecedy. Za jménem třídy zde musí být závorky!
NovyObjekt = MojeTrida()
Co by se stalo, kdyby tam závorky nebyly? Nyní můžeme používat funkci (tzv. metodu) objektu:
NovyObjekt.VypisAbecedu()

Parametr self

Pokud voláme nějakou funkci patřící nějakému objektu (tzv. metody), vždy se jako první parametr doplní "self". (Viz výše) Self je objekt, jemuž funkce patří.
class MojeTrida:
    def VypisAbeceduSVarovanim(self):
        print("Pozor, bude prozrazeno 8 písmen abecedy!")
        self.VypisAbecedu()
    def VypisAbecedu(self):
        print("Abcdefgh")

MojeTrida().VypisAbeceduSVarovanim()

Proměnné v objektu a inicializace __init__()

Když vytváříme objekt příkazem "NovyObjekt = MojeTrida()", může se tím rovnou zavolat jeho funkce se speciálním jménem __init__():
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

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

Zjištění třídy

Funkce isinstance navrátí True, pokud je objekt instancí uvedené třídy.
isinstance(obj, MojeTridaBezpecna)

To platí i pro toto, zkuste si to 

isinstance(obj, MojeTrida)
Pozn. stále můžete používat univerzální zabudovanou funkci type()

Docstring v definici tříd

Doporučuji do tříd zapisovat i docstring, ať to po vás lidi pochopí:
class a:
    """Toto je nějaký docstring, tahle třída nedělá vůbec nic."""
    pass
Získat ho jde jako speciální proměnnou, která -- pozor -- tentokrát patří třídě, nikoli objektům: a.__doc__

Zpět na obsah | Poslední úprava: 2011-10-31