Studijní materiály
EXTRA Kontakt

Třídy

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

Definování Třídy

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.

Vytváření instancí třídy (objektů)

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

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.

Co je to self?

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 v Třídách

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!

Třídní a instanční proměnné

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 v Třídách

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

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

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

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.