Objekty a třídy v Pythonu – Palačinkový recept

Co se naučíme

Recept jako třída

Funkce jsme si vysvětlovali na receptu na palačinky.


def osmaz_jednu_palacinku():
    print("Nalij těsto na pánev.")
    print("Osmaž palačinku z jedné strany.")
    print("Otoč palačinku.")
    print("Dej palačinku na talíř.")

def namaz_palacinku(cim_namazat):
    "namaze palacinu"
    print("Namaž palačinku", cim_namazat, ".")
    print("Zaroluj palačinku.")

print("Recept na palačinky:")
print("--------------------")
print("Smíchej mouku, vejce, mléko a špetku soli.")
print("Vyšlehej do hladkého těsta.")
osmaz_jednu_palacinku()
osmaz_jednu_palacinku()
osmaz_jednu_palacinku()
osmaz_jednu_palacinku()

namaz_palacinku("jahodovou marmeládou")
namaz_palacinku("čokoládovým krémem")
namaz_palacinku("tvarohem")
namaz_palacinku("medem")
print("Palačinky odnes na stůl a podávej.")


      
Teď si představme, že chceme ten recept použít znovu, ale s různým počtem palačinek a různou náplní.

To je ideální práce pro třídu – takový univerzální recept, podle kterého si pak uděláme objekty, tedy konkrétní dávky palačinek.

Příklad: Třída Palacinka

class Palacinky:
    def __init__(self, pocet_palacinek, cim_plnime):
        self.pocet_palacinek = pocet_palacinek
        self.mouka = 15 * pocet_palacinek
        self.sul = round(0.1 * pocet_palacinek)
        self.vejce = round(0.2 * pocet_palacinek)
        self.mleko = 37 * pocet_palacinek
        self.cim_plnime = cim_plnime

    def __str__(self):
        return (
            f"Recept na palačinky:\n"
            f"--------------------\n"
            f"Smíchej {self.mouka} g mouky, {self.vejce} vajec, {self.mleko} ml mléka a {self.sul} špetek soli.\n"
            f"Vyšlehej do hladkého těsta.\n"
        )
    def osmaz_jednu(self):
        """osmaží jednu palačinku"""
        print("Nalij těsto na pánev.")
        print("Osmaž palačinku z jedné strany.")
        print("Otoč palačinku.")
        print("Dej palačinku na talíř.")

    def osmaz_vsechny(self):
        """osmaží všechny palačinky"""
        for palacinka in range(self.pocet_palacinek):
            print(f"Smažíme {palacinka+1}. palačinku:")
            self.osmaz_jednu()
            print()
            time.sleep(2)

    def namaz_jednu(self):
        """namaže palacinku"""
        print(f"Namaž palačinku {self.cim_plnime}.")
        print("Zaroluj palačinku.")

    def namaz_vsechny(self):
        """namaže všechny palačinky"""
        for palacinka in range(self.pocet_palacinek):
            print(f"Mažeme {palacinka+1}. palačinku:")
            self.namaz_jednu()
            print()
            time.sleep(2)

        print("Palačinky odnes na stůl a podávej.")



palacinky = Palacinky(5, "tvarohem")

print(palacinky)
palacinky.osmaz_vsechny()
palacinky.namaz_vsechny()

Třída Palacinka reprezentuje jeden konkrétní recept, a my si z ní vytvoříme objekt palacinky – 10 palačinek s tvarohem.

‍👩‍🍳 Co dělá __init__?

__init__ je speciální metoda, která se spustí automaticky, když vzniká nový recept na várku palačinek. Řekneme jí třeba: Palacinka(5, "marmeláda") – a ona si na základě toho, že chceme 5 palačinek s marmeládou spočítá, kolik mouky a vajec bude potřeba, a všechno si připraví na další vaření. A to si uloží jako svoje atributy.

🧁 A co je self?

self je takové kouzelné slovo, které v metodách vždy odkazuje na náš konkrétní recept na várku palačinek. Když píšeme self.napln, myslíme tím právě tu náplň, kterou jsme zadali při vytváření – třeba marmeládu nebo tvaroh. Každá várka palačinek si nese svoje vlastní údaje, a self nám pomáhá se k nim kdykoliv vrátit.

Shrnutí

Pojmy