2. díl - První objektová aplikace v Pythonu - Hello object world

Python Objektově orientované programování První objektová aplikace v Pythonu - Hello object world

Minulý díl seriálu nás uvedl do objektově orientovaného programování. Již víme, že objekty mají atributy a metody. Také víme, že k vytvoření objektu vytvoříme nejprve třídu. Ta je vzorem, podle kterého následně tvoříme její instance.

Na začátku sekce se základními strukturami jazyka Python jsme si vytvořili program Hello world. Udělejme si nyní podobný program jako úvod do objektově orientovaného programování. Naprogramujme si Hello object world!

Otevřeme IDLE (nebo jiný editor) a otevřeme nový soubor. Třídy se vytvářejí klíčovým slovem class. Třídu pojmenujeme Zdravic. Ve třídě bude blok kódu, takže za jméno třídy píšeme dvojtečku. První řádka tedy vypadá takto:

class Zdravic:

Název třídy píšeme vždy velbloudí notací bez mezer a na rozdíl od proměnných má každé slovo v názvu velké první písmeno. Název je samozřejmě také bez diakritiky, tu v programu používáme maximálně uvnitř textových řetězců, nikoli v identifikátorech. Podle této třídy později vytvoříme objekt zdravič, který nás bude umět pozdravit. Vidíme, že se na program již díváme úplně jinak, za každou akci je zodpovědný nějaký objekt. V našem případě vám to může přijít zbytečné, u složitějších aplikací si to budete pochvalovat :)

Nyní si do třídy Zdravic přidáme metodu pozdrav(), bude veřejně viditelná a nebude mít žádnou návratovou hodnotu ani atributy.

Deklarace metody v Pythonu je podobná deklaraci funkce. Za klíčovým slovem def následuje samotný název metody, metody píšeme stejně jako proměnné a funkce malými písmeny. V případě víceslovného názvu použijeme podtržítka. Závorka s parametry je povinná. První povinný poziční argument je self. Do něj se vloží "odkaz" na objekt, do kterého metoda náleží. Tento argument tam vloží sám objekt. Do těla metody zapíšeme kód pro výpis do konzole.

Naše třída bude nyní vypadat takto:

class Zdravic:

    def pozdrav(self):
        print("Hello object world!")

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

Nyní si vytvoříme instanci třídy Zdravic. Bude to tedy ten objekt zdravič, se kterým budeme pracovat. Objekty se ukládají do proměnných, název třídy slouží jako datový typ. Instance má zpravidla název třídy, jen má první písmeno malé. Deklarujme si proměnnou a následně v ní založme novou instanci třídy Zdravic:

zdravic = Zdravic()

Při vytvoření nové instance se zavolá tzv. konstruktor. To je speciální metoda na třídě, proto při vytvoření instance píšeme ty prázdné závorky, jelikož voláme tuto "vytvářecí" metodu. Konstruktor zpravidla obsahuje nějakou inicializaci vnitřního stavu instance (např. dosadí výchozí hodnoty do proměnných). My jsme v kódu žádný konstruktor nedeklarovali, Python si proto vytvořil tzv. implicitní prázdný konstruktor. Vytvoření instance objektu je tedy podobné volání metody.

Jelikož v proměnné nyní máme opravdu instanci třídy Zdravic, můžeme instanci nechat pozdravit. Zavoláme na ni metodu pozdrav a to jako zdravic.pozdrav(). K aplikaci přidáme ještě input(). Náš kód bude tedy nyní vypadat následovně:

class Zdravic:

    def pozdrav(self):
        print("Hello object world!")

zdravic = Zdravic()
zdravic.pozdrav()
input()

Program spustíme.

První objektová aplikace v Python – Hello object world

Máme tedy svou první objektovou aplikaci!

Dejme nyní naší metodě pozdrav() parametr jmeno, aby dokázala pozdravit konkrétního uživatele:

def pozdrav(self, jmeno):
    print("Ahoj uživateli {0}!".format(jmeno))

Vidíme, že syntaxe parametru metody je stejná, jako syntaxe proměnné. Jednotlivé parametry oddělujeme čárkou. Upravíme také kód pod třídou:

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

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...". Odteď budeme dělit kód logicky do metod.

Pozdravení uživatelů v objektové aplikaci v Pythonu

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

def pozdrav(self, jmeno):
    print("{0} {1}!".format(self.text, jmeno))

Avšak díky tomu, že zatím nemáme metodu konstruktoru, tak musíme atribut text inicializovat před zavoláním metody, která tento atribut vyžaduje.

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")
input()

Program nyní zobrazí:

Pozdravení uživatelů v objektové aplikaci v Pythonu

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ážím na naše vypisování do konzole. Každý objekt by měl mít určitou kompetenci a tu 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 ho však přizpůsobíme tak, aby daná metoda text pouze vracela a bylo 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. Return metodu ukončí a navrátí hodnotu. Jakýkoli další kód v těle metody po return se již neprovede! Upravme třídu:

Metoda pozdrav:

def pozdrav(self, jmeno):
    return "{0} {1}!".format(self.text, jmeno)

Hlavní část programu:

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"))
input()

Nyní je náš kód dle dobrých praktik. 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 ("""). Jestliže do interaktivní konzole v IDLE (příkazová řádka Windows nepodporuje unicode) zadáme příkaz help() a jako parametr napíšeme název třídy, zobrazí její popis i popis všech jejích metod. Zdokumentovaná třída může vypadat např. takto:

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

    def pozdrav(self, jmeno):
        """
        Vrátí pozdrav uživatele s nastaveným textem a jeho jménem.
        """
        return "{0} {1}!".format(self.text, jmeno)

Podíváme se, že se nám popisky zobrazí po importování modulu a napsání příkazu help():

Metody objektu zdravic v Python Shellu

A jsme u konce. Námi napsaný program má již nějakou úroveň, i když vlastně nic nedělá. Za úkol máte předělat si naši konzolovou kalkulačku do objektů. Příště si uděláme takovou jednoduchou hříčku, necháme dva objekty (bojovníky) soupeřit v aréně (také objektu). Máte se na co těšit ;-)


 

Stáhnout

Staženo 135x (545 B)
Aplikace je včetně zdrojových kódů v jazyce python

 

  Aktivity (1)

Článek pro vás napsal gcx11
Avatar
(^_^)

Jak se ti líbí článek?
Celkem (6 hlasů) :
55555


 



 

 

Komentáře

Avatar
Michal Žůrek (misaz):

Jak je to s dokumentací parametrů u metod?

Odpovědět 10.6.2014 6:49
Nesnáším {}, proto se jim vyhýbám.
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
hanpari:

Existuje takzvaný docstring.

>>> def funkce(x):
"""
Tahle funkce vrací druhou mocninu.
"""
        return x**2

>>> help(funkce)
Help on function funkce in module __main__:

funkce(x)
    Tahle funkce vrací druhou mocninu.

Více třeba tady:
http://www.pythonforbeginners.com/…n-docstrings

TAdy je ještě jedna zajímavá vlastnost docstringu, že se jeho obsah dá použít i v jednoduchém testováním jednotek. Viz tady:

https://docs.python.org/…doctest.html#…

 
Odpovědět  +1 11.6.2014 5:54
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
gcx11:

Můžeš použít podobnou dokumentaci, jako má funkce print():

 
Odpovědět 11.6.2014 15:29
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
hanpari:

Uvědomil jsem si, že ty jsi vlastně chtěl toto:

#Příklad využití anotace funkce
def secti(x:int, y:int)->int:
    """
    Vrací součet x a y
    """
    return x + y


#Tento kód je OK
secti(5, 6)
#Ale tento také! Anotace si nevynucuje typovou správnost!
secti(2, 1.1)

help(secti)

Poslední řádek vypíše toto:

Help on function secti in module __main__:

secti(x: int, y: int) -> int
    Vrací součet x a y
 
Odpovědět 21.6.2014 21:20
Avatar
Lupti
Člen
Avatar
Lupti:
class Kalkulacka:
"""
trieda kalkulacka reprezentuje metody pre vykonanie urcitych
funkcii kalkulacky
"""
    def volba_cisla(self, zadanie_cisla):
    """
    vrati cislo zadane pouzivatelom s ktorym chce dalej pocitat,
    osetrene su chybne zadania uzivatela
    """
        pokracovanie = True
        while pokracovanie:
            try:
                cislo = int(input(zadanie_cisla))
                pokracovanie = False
            except ValueError:
                print('\nzadali ste nespravny vstup, pokus opakujte')
        return cislo

borci vypisujeme mi 'expected an intended block' Error na zaciatku riadku except ValueError:, netusim ale kde robim chybu. prosim poradte

Editováno 12.2.2015 19:55
 
Odpovědět 12.2.2015 19:52
Avatar
Lupti
Člen
Avatar
Odpovídá na Lupti
Lupti:

teda sorry je to o riadok vyssie na riadku: 'pokracovanie = False'

 
Odpovědět 12.2.2015 19:58
Avatar
David.Landa
Člen
Avatar
David.Landa:

Musíš odsadit komentáře třídy i funkce.

 
Odpovědět 13.2.2015 10:06
Avatar
Lupti
Člen
Avatar
 
Odpovědět 13.2.2015 11:12
Avatar
Jan Říha
Člen
Avatar
Jan Říha:

Ahoj, toto je správně?
print("Ahoj uživateli {0}!".format(jme­no))
Honza

 
Odpovědět 7. května 19:14
Avatar
Jan Říha
Člen
Avatar
Jan Říha:

Ahoj Honzo,
je to správně. Nebuď netrpělivý a pozorně čti návody.
Honza

 
Odpovědět  +1 7. května 19:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.