Pomocí objektů si můžeme vytvářet vlastní datové typy.
Objekty obsahují
data
(kterým se říkáatributy
objektu)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"