Pomocí objektů si můžeme vytvářet vlastní datové typy.
Objekty obsahují
data(kterým se říkáatributyobjektu)a
funkce(kterým se říkámetody)
K atributům a metodám se přistupuje přes tečku.
Skoro všechno v pythonu je objekt - již znáte např. následující metody:
seznam.append() - metoda typu list
"".join(seznam) - metoda typu string
rozdělení programu, struktura kódu (modularita)
co program dělá (na venek) je oddělené od toho jak to dělá (abstrakce)
třída= šablona, datový typnapř. string
objekt= instance třídy, konkrétní provedení, které vznikne ze šablonynapř. "velryba"
class Pes:
pass
Nyní si můžeme vytvářet objekty typu Pes:
pes1 = Pes()
pes2 = Pes()
print(pes1)
print(pes2)
<__main__.Pes object at 0x0000017F344880A0> <__main__.Pes object at 0x0000017F344885E0>
K prázdnému objektu přidáme data (atributy) a funkce (metody):
class Pes:
pocet_nohou = 4
pes1 = Pes()
pes1.pocet_nohou
4
Přidáme metodu zastekej()
class Pes:
pocet_nohou = 4
def zastekej(self):
print("Haf")
pes1 = Pes()
print(pes1.pocet_nohou)
pes1.zastekej()
4 Haf
Vysvětlení:
pocet_nohou je proměnná třídy, je to vlastnost všech psů
Každá metoda má jako první parametr "tento objekt", např. pes1. Je zvykem pojmenovávat ho self.
Metodě můžete předávat parametry jako běžné funkci
class Pes:
def zastekej(self, pocet = 1):
for i in range(pocet):
print("Haf")
pes1 = Pes()
pes1.zastekej()
print()
pes1.zastekej(3)
Haf Haf Haf Haf
= vlastnost konkrétního psa
Proměnnou instance můžeme přidat k již vytvořenému objektu, (psa můžeme v průběhu jeho života pojmenovat):
class Pes:
pass
pes1 = Pes()
pes1.jmeno = "Fík"
Nebo můžeme proměnnou instance vytvořit již při vytváření objektu (pes se se jménem již narodí). K tomu slouží speciální metoda, které se říká konstruktor.
Konstruktor je speciální metoda, která se zavolá při vytváření objektu. Slouží k inicializaci, tj. k počátečnímu nastavení objektu.
Jmenuje se __init__. Tak jako v případě ostatních metod, její první parametr bude self.
class Pes:
def __init__(self, jm):
self.jmeno = jm
pes1 = Pes("Fík")
pes1.jmeno
'Fík'
K proměnným instance uvnitř metod můžeme přistupova pomocí self, např. self.jmeno:
class Pes:
def __init__(self, jm):
self.jmeno = jm
def zastekej(self):
print("Haf"+self.jmeno)
pes1 = Pes("Fík")
pes2 = Pes("Alík")
pes1.zastekej()
pes2.zastekej()
pes1.zastekej()
HafFík HafAlík HafFík
Pomocí proměnné třídy můžeme spočítat, kolikrát se celkem zaštěkalo. Proměnná nepatří žádnému konkrétnímu psovi, ale celé třídě psů.
class Pes:
kolikrat = 0
def __init__(self, jm):
self.jmeno = jm
def zastekej(self):
print("Haf"+self.jmeno)
Pes.kolikrat += 1
pes1 = Pes("Fík")
pes2 = Pes("Alík")
pes1.zastekej()
pes2.zastekej()
pes1.zastekej()
Pes.kolikrat
HafFík HafAlík HafFík
3
Speciální řetězec s popisem třídy nebo funkce. Můžeme si ho nechat vypsat pomocí atributu .__doc__, také nám ho může "napovídat" naše vývojové prostředí.
def scitani(a,b):
"""funkce sečte své dva vstupní parametry a vrátí výsledek"""
return a+b
scitani.__doc__
'funkce sečte své dva vstupní parametry a vrátí výsledek'
class Pes:
"""Psí třída"""
pocet_nohou = 4
pes1 = Pes()
print(pes1.__doc__)
print(Pes.__doc__)
Psí třída Psí třída
class Pes:
"""Psí třída"""
pocet_nohou = 4
def zastekej(self):
"""Funkce vypíše 'Haf' na výstup"""
print("Haf")
pes1 = Pes()
pes1.zastekej.__doc__
"Funkce vypíše 'Haf' na výstup"