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:
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")
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