Třídy jsou základním kamenem objektově orientovaného programování (OOP). Umožňují vám vytvářet vlastní datové typy, které mají své atributy (proměnné) a metody (funkce). Tímto způsobem můžete lépe organizovat svůj kód a vytvářet modulární, opakovaně použitelná řešení.
Jednoduše si třídu můžeme představit jako plán nebo šablonu. Když třeba chcete postavit dům, potřebujete plány. Ty nám říkají, jak bude dům vypadat, ale dům sám o sobě ještě není. Třída je právě takový plán. Pomocí třídy můžeme vytvořit objekty (konkréní domy).
Třída v Pythonu je definována klíčovým slovem class
. Název třídy vždy začíná velkým písmenem následovaným názvem třídy a dvojtečkou. Všechny metody a atributy třídy jsou potom odsazeny.
Vytvoříme jednoduchou třídu, která se jmenuje Pes.
class Pes:
def stekej(self):
print("Haf haf!")
Tady jsme vytvořili třídu Pes a do ní jsme přidali metodu stekej, která bude psát "Haf haf!" na obrazovku, když ji zavoláme.
Nyní, když máme třídu, můžeme z ní vytvořit objekty. Tento proces se nazývá vytváření instance. To znamená, že vytvoříme konkrétní objekt (např. konkrétní pes).
Vytvoříme objekt třídy Pes a zavoláme jeho metodu stekej.
muj_pes = Pes()
muj_pes.stekej()
Tímto jsme vytvořili objekt muj_pes a zavolali jeho metodu stekej, která nám na obrazovce napíše "Haf haf!".
Konstruktor je speciální metoda, která se spouští vždy, když vytváříme nový objekt. V Pythonu se tato metoda jmenuje __init__
. Pomocí této metody můžeme nastavit vlastnosti objektu hned při jeho vytvoření.
Vytvoříme třídu Pes s konstruktorem, který nám umožní zadat jméno psa při jeho vytvoření.
class Pes:
def __init__(self, jmeno):
self.jmeno = jmeno
def stekej(self):
print(self.jmeno, "rika: Haf haf!")
Nyní můžeme při vytváření objektu zadat jméno psa.
muj_pes = Pes("Azor")
muj_pes.stekej() # Azor rika: Haf haf!
Vidíte, že jsme vytvořili psa jménem Azor, který nám teď "štěká" s vlastním jménem.
self
je speciální proměnná, která odkazuje na aktuální objekt. Když vytvoříme objekt, self
nám umožní přistupovat k jeho atributům a metodám.
Když zavoláme self.jmeno, přistupujeme k jménu konkrétního psa (toho, který voláme).
Atributy jsou informace, které objekt má. Může to být například jméno psa nebo jeho věk.
Tady jsme přidali atribut vek k našemu psovi.
class Pes:
def __init__(self, jmeno, vek):
self.jmeno = jmeno
self.vek = vek
def stekej(self):
print(self.jmeno, self.vek, "let stary, rika: Haf haf!")
Nyní můžeme zadat jak jméno, tak i věk psa.
muj_pes = Pes("Azor", 5)
muj_pes.stekej() # Azor, 5 let stary, rika: Haf haf!
V Pythonu mohou třídy obsahovat dva typy proměnných: třídní proměnné a instanční proměnné.
class Skola:
nazev = "Základní škola"
def __init__(self, jmeno_studenta):
self.jmeno_studenta = jmeno_studenta
# Vytvoření dvou instancí
student1 = Skola("Jan Novák")
student2 = Skola("Eva Svobodová")
print(student1.nazev) # Výstup: Základní škola
print(student2.nazev) # Výstup: Základní škola
# Změna třídní proměnné
Skola.nazev = "Gymnázium"
print(student1.nazev) # Výstup: Gymnázium
print(student2.nazev) # Výstup: Gymnázium
# Změna instanční proměnné
student1.jmeno_studenta = "Jan Novák Ph.D."
print(student1.jmeno_studenta) # Výstup: Jan Novák Ph.D.
print(student2.jmeno_studenta) # Výstup: Eva Svobodová
V tomto příkladu jsme ukázali rozdíl mezi třídními a instančními proměnnými. Třídní proměnná nazev
je sdílená mezi všemi instancemi, zatímco instanční proměnná jmeno_studenta
je unikátní pro každou
instanci.
Metody jsou funkce uvnitř třídy, které říkají, co objekt dělá. Metody mají přístup ke všem atributům třídy přes klíčové slovo self
.
Metoda kolik_let, která nám řekne, kolik je psovi let.
class Pes:
def __init__(self, jmeno, vek):
self.jmeno = jmeno
self.vek = vek
def stekej(self):
print(self.jmeno, "rika: Haf haf!")
def kolik_let(self):
print(self.jmeno, "je", self.vek, "let stary.")
Teď můžeme zavolat jak metodu stekej, tak i metodu kolik_let, která nám řekne věk psa.
muj_pes = Pes("Azor", 5)
muj_pes.stekej() # Azor rika: Haf haf!
muj_pes.kolik_let() # Azor je 5 let stary.
Můžete definovat různé typy metod včetně běžných metod, třídních metod a statických metod.
Běžné metody mají přístup k instančním proměnným a mohou měnit stav objektu.
class Osoba:
def __init__(self, jmeno, vek):
self.jmeno = jmeno
self.vek = vek
def predstav_se(self):
print("Ahoj, jmenuji se", self.jmeno, "a je mi", self.vek, "let.")
Tato třída Osoba
má metodu predstav_se
, která přistupuje k instančním proměnným jmeno
a vek
.
Třídní metody se definují pomocí dekorátoru @classmethod
a jako první parametr přijímají cls
, což odkazuje na samotnou třídu.
class Kruh:
pi = 3.14159
@classmethod
def vypocitej_obvod(cls, polomer):
return 2 * cls.pi * polomer
Tato třída Kruh
má třídní metodu vypocitej_obvod
, která používá třídní proměnnou pi
.
Statické metody se definují pomocí dekorátoru @staticmethod
. Tyto metody nemají přístup k instančním ani třídním proměnným a obvykle slouží k vytváření pomocných funkcí, které se vztahují k třídě, ale nepotřebují přístup k jejím datům.
class Matematika:
@staticmethod
def nasob(a, b):
return a * b
Statická metoda nasob
v třídě Matematika
jednoduše vrátí součin dvou čísel.