NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Lekce 3 - Atributy a metody v Pythonu Nové

V minulé lekci, První objektová aplikace v Pythonu - Hello object world, jsme si ukázali jak OOP funguje, vysvětlili jsme si pojmy třída a metoda. Naprogramovali jsme si naši první objektovou aplikaci.

V dnešní lekci Pythonu si uvedeme parametry metod, naučíme se používat atributy a tím dokončíme naši první objektovou aplikaci. Nakonec si ukážeme využití komentářů.

Parametry metody

Dejme nyní naší metodě pozdrav() parametr jmeno, aby dokázala pozdravit konkrétního uživatele. Přejdeme do souboru Zdravic.py a takto kód upravme:

def pozdrav(self, jmeno):
    print(f"Ahoj uživateli {jmeno}")

Vidíme, že syntaxe parametru metody je stejná, jako syntaxe proměnné. Kdybychom chtěli parametrů více, oddělujeme je čárkou. Upravíme také kód pod třídou:

class Zdravic:
    def pozdrav(self, jmeno):
        print(f"Ahoj uživateli {jmeno}")

zdravic = Zdravic()
zdravic.pozdrav("Karel")
zdravic.pozdrav("Petr")

A výsledek:

Výstup metody pozdrav():
Ahoj uživateli Karel
Ahoj uživateli Petr

Náš kód je nyní v metodě a my ho můžeme jednoduše pomocí parametrů volat znovu s různými parametry. Nemusíme 2x opisovat "Ahoj uživateli...". Kód budeme odteď dělit logicky do metod.

Atributy třídy

Třídě přidáme nějaký atribut. Nabízí se atribut text, kde bude uložen text pozdravu. Atributy se definují stejně, jako proměnné. Upravme tedy naši třídu:

class Zdravic:
    text = ""
    def pozdrav(self, jmeno):
        print(f"{self.text} {jmeno}")

zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
zdravic.pozdrav("Karel")
zdravic.pozdrav("Petr")
zdravic.text = "Vítám tě tu programátore"
zdravic.pozdrav("Richard")

Text nyní musíme pochopitelně nastavit vytvořené instanci:

zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
zdravic.pozdrav("Karel")
zdravic.pozdrav("Petr")
zdravic.text = "Vítám tě tu programátore"
zdravic.pozdrav("Richard")

Výsledek:

Konzolová aplikace
Ahoj uživateli Karel
Ahoj uživateli Petr
Vítám tě tu programátore Richard

Návratová hodnota metody

Vzhledem k objektovému návrhu není nejvhodnější, aby si každý objekt ovlivňoval vstup a výstup, jak se mu zachce. Pochopitelně narážíme na naše vypisování do konzole. Každý objekt by měl mít určité kompetence, které by neměl překračovat. Pověřme náš objekt pouze sestavením pozdravu a jeho výpis si zpracujeme již mimo. Výhodou takto navrženého objektu je vysoká univerzálnost a znovupoužitelnost. Objekt doposud umí jen psát do konzole. My si jej však přizpůsobíme tak, aby daná metoda text pouze vracela. Bude pak pouze na jeho příjemci, jak s ním naloží. Takto můžeme pozdravy ukládat do souborů, psát na webové stránky nebo dále zpracovávat.

K návratu hodnoty použijeme příkaz return. Příkaz return metodu ukončí a navrátí hodnotu. akýkoli kód v těle metody po příkazu return se již neprovede! Upravíme metodu pozdrav():

def pozdrav(self, jmeno):
    return f"{self.text} {jmeno}"

A náš program bude nyní vypadat takto:

class Zdravic:
    text = "Ahoj"
    def pozdrav(self, jmeno):
        return f"{self.text} {jmeno}"

zdravic = Zdravic()
zdravic.text = "Ahoj uživateli"
print(zdravic.pozdrav("Karel"))
print(zdravic.pozdrav("Petr"))
zdravic.text = "Vítám tě tu programátore"
print(zdravic.pozdrav("Richard"))

Nyní je náš kód dle dobrých praktik.

Komentáře

Ještě naši třídu okomentujme, jak se sluší a patří. Komentáře budeme psát pod název třídy a pod název každého atributu a metody. K jejich zápisu použijeme tři dvojité uvozovky ("""). Zdokumentovaná třída může vypadat např. takto:

class Zdravic:
    """
    Třída reprezentuje zdravič, který slouží ke zdravení uživatelů.
    """

    text = "Ahoj"
    """
    Atribut obsahující výchozí text pozdravu. Pokud není specifikován jiný text,
    použije se tento výchozí text při sestavování pozdravu.
    """

    def pozdrav(self, jmeno):
        """
        Vrátí pozdrav uživatele s nastaveným textem a jeho jménem.

        Parametry:
        - jmeno (str): Jméno osoby, kterou chceme pozdravit.

        Výstup:
        - str: Text pozdravu s jménem osoby.
        """
        return f"{self.text} {jmeno}"

Význam self

V Pythonu je self jedním z klíčových konceptů v objektově orientovaném programování a je důležité ho pochopit. Když už víme, co je instance a jak se tvoří atributy, pojďme si jej vysvětlit jednoduše a názorně.

Když vytváříme objekt (instanci třídy), představíme si ho jako speciální box. Každý box (objekt) má svá vlastní data (atributy) a nástroje, které s tímto boxem lze dělat (metody). Když chceme, aby box (objekt) něco udělal, potřebujeme způsob, jak na tento konkrétní box odkazovat. A právě self je způsob, kterým toho dosáhneme.

Technické detaily self

V Pythonu se metoda vždy automaticky volá s referencí na objekt, se kterým byla zavolána. Tento objekt se předává jako první parametr metody. Konvencí je, že se tento parametr nazývá self. Když voláme metodu objektu, např. muj_objekt.moje_metoda(), nemusíme self předávat explicitně. Python to za nás udělá automaticky.

Název prvního parametru - self - může být i jiný, ale my se budeme držet zavedených praktik.

Proč self potřebujeme

Když máme více boxů (objektů) stejného typu (třídy), musí metoda vědět, s kterým konkrétním boxem má pracovat. Představme si, že máme v kanceláři a doma dva identické kávovary, protože kafe není nikdy dost :-) Oba kávovary jsou stejného modelu (třídy). Každý kávovar má tedy metodu dopln_vodu(), která slouží k doplnění vody do daného kávovaru. V tomto kontextu je self klíčový.

Jak identifikujeme, kterému kávovaru došla voda? Kdyby kávovary mohly mluvit, řekl by nám kávovar doma, kterému skutečně došla voda: "To já jsem na suchu!". V Pythonu pro to máme self. Díky němu mu dokážeme nařídit: "OK, kávovare (self), doplň si vodu."

Ukažme si příklad reálného kódu:

class Kavovar:
    umisteni = "neznámé místo"
    mnozstvi_vody = 0

    def dopln_vodu(self, mnozstvi):
        self.mnozstvi_vody += mnozstvi
        print(f"Do kávovaru {self.umisteni} bylo doplněno {mnozstvi} ml vody. "
              f"Celkem je v něm nyní {self.mnozstvi_vody} ml vody.")

    def uvar_kavu(self):
        if self.mnozstvi_vody > 100:
            self.mnozstvi_vody -= 100
            print(f"Kávovar {self.umisteni} uvařil kávu. Zbývá {self.mnozstvi_vody} ml vody.")
        else:
            print(f"V kávovaru {self.umisteni} není dostatek vody!")

# Vytvoříme dvě instance kávovaru
kavovar_doma = Kavovar()
kavovar_v_kancelari = Kavovar()

# Nastavíme umístění pro oba kávovary
kavovar_doma.umisteni = "doma"
kavovar_v_kancelari.umisteni = "v kanceláři"

# Doplníme vodu do kávovaru v kanceláři
kavovar_v_kancelari.dopln_vodu(150)

# Zkusíme uvařit kávu v kávovaru doma
kavovar_doma.uvar_kavu()

V konzoli uvidíme výstup:

Použití self:
Do kávovaru v kanceláři bylo doplněno 150 ml vody. Celkem je v něm nyní 150 ml vody.
V kávovaru doma není dostatek vody!

Bez použití self v self.umisteni a self.mnozstvi_vody by metody dopln_vodu() a uvar_kavu() neměly šanci zjistit, jestli je využívá instance kávovaru doma nebo toho v kanceláři. Self tu tedy slouží jako odkaz na konkrétní instanci kávovaru. Pokud bychom self v metodách třídy nepoužili, tyto metody by neměly přístup k datům uloženým v konkrétní instanci třídy a nemohly by provádět operace specifické pro tu danou instanci.

A jsme u konce. Za úkol máte předělat si naši konzolovou kalkulačku do objektů.

V následujícím kvízu, Kvíz - Úvod, objekty, třídy a metody v Pythonu, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 2x (4.46 kB)
Aplikace je včetně zdrojových kódů v jazyce Python

 

Předchozí článek
První objektová aplikace v Pythonu - Hello object world
Všechny články v sekci
Objektově orientované programování v Pythonu
Přeskočit článek
(nedoporučujeme)
Kvíz - Úvod, objekty, třídy a metody v Pythonu
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
7 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity