Třída, laicky řečeno, slouží k definování objektu (z čeho se objekt skládá, jak je velký atd). Třídou je například datový typ int, seznam (list) atd.
Objekt je instancí třídy. Například proměnná typu int je instancí třídy int. Objekt obsahuje metody a atributy.
Metody objektu jsou vlastně funkce uvnitř objektu, které mohou pracovat s atributy objektu. Přistupuje se k nim přes tzv. tečkovou notaci. Setkali jsme se již z třídou seznam, která má například metodu sort().
Atributy objektu slouží k uchovávání nějakých dat. Objekt, který nemá metody, ale jen atributy je téměř totéž, jako struktura :-}. Oproti struktuře však každý objekt má dvě speciální metody Jedna se nazývá konstruktor, druhá destruktor. Pokud je nevytvoříte Vy, udělá to za Vás Python.
Konstruktor je speciální metoda, která je automaticky volána pří vzniku objektu. Jindy ji volat nelze. I když konstruktor nedefinujete, je součástí třídy (vytvoří jej za vás Python). Konstruktor je vždy pojmenovaný __init__
Destruktor je speciální metoda, která je automaticky volána při zániku objektu (např. při zrušení objektu příkazem del). Jindy ji volat nelze. I když konstruktor nedefinujete, je součástí třídy (vytvoří jej za vás Python).Destruktor je vždy pojmenovaný __del__
Další speciální metody
Dědičnost - lze vytvořit
třídu, která převezme (zdědí) metody a atributy jiné již existující
třídy a přidá k nim vlastní. Taková třída se nazývá potomkem
a třída, po které dědí se nazývá předchůdcem.
Za dvojtečkou následuje blok definující atributy a metody třídy.
Ve třídě může být také docstring.
Objekt se vytváří takto:
>>> nazev_objektu=nazev_tridy ()
Uvnitř závorek může být požadován argument. Jelikož i datové typy jsou objekty, lze například i objekt třídy float vytvořit tímto způsobem (zde je argument povinný):
>>> x = float(3)
>>> print x
3.0
Právě toho se využívá při přetypování!
>>> class trida1:
... """Tato trida obsahuje jen atribut cislo"""
... cislo=0
...
>>>
Nyní je třeba vytvořit instanci třídy (tj. objekt) trida1.
A nyní je možné přes tečkovou notaci přistupovat k atributům objektu.>>> instance = trida1()
>>> instance.__doc__ 'Tato trida obsahuje jen atribut cislo' >>> instance.cislo 0 >>> instance.cislo=5 >>> instance.cislo 5
Příkaz objekt.metoda2(5,5) by se dal nahradit příkazy objekt.cislo=5 a objekt.cislo2=5. Použití metody je ovšem viditelně elegantnější.>>> class trida2: ... """Tato trida slouzi k pochopeni vytvareni metod""" ... cislo=0 # atribut tridy ... cislo2=0 # ---- || ---- ... def metoda1(self): # definice prvni metody ... "Tato metoda vynasobi cislo*cislo2" ... return self.cislo*self.cislo2 ... def metoda2(self,a,b): # definice druhe metody ... "Dosadi 'a' za atribut cislo a 'b' za atribut cislo2" ... self.cislo=a ... self.cislo2=b ... >>> objekt=trida2() >>> objekt.metoda2.__doc__ "Dosadi 'a' za atribut cislo a 'b' za atribut cislo2" >>> objekt.metoda2(5,5) >>> objekt.metoda1() 25
Všimněte si, že se první argument u metody nemusí jmenovat self. Konstruktor lze samozřejmě využívat efektivněji. Například je tam možné vytvořit nějaké atributy třídy (např. self.cislo=0) a dosadit za ně (inicializovat je). Například pomocí funkce vracející aktuální čas čas vzniku objektu atp..>>> class trida3: ... def __init__(prvni_argument_je_self): ... print "Cislo 3 zije!" ... def __del__(self): ... print "Cislo tri umrelo" ... >>> t = trida3() Cislo 3 zije! >>> del t Cislo tri umrelo
>>> class cisla: #predchudce
... def __init__(self):
... self.c = []
... def pridej(self,co):
... if type(co) == type(0):
... self.c += [co]
...
>>> class kladna_cisla(cisla): #naslednik
... def __init__(self):
... cisla.__init__(self)
... def pridej(self,co):
... if co >= 0:
... cisla.pridej(self,co)
...
>>> zasobnik = kladna_cisla()
>>> zasobnik.pridej(5)
>>> zasobnik.pridej(-3)
>>> zasobnik.pridej('text')
>>> zasobnik.pridej(3.3)
>>> print zasobnik.c
[5]
S objekty toho lze dělat mnohem, mnohem více. Doporučuji
prostudovat dokumentaci :-).
