seOOP je programovací přístup, kdy jsou objekty definovány pomocí metod (funkce, činnosti nebo události) a vlastnosti (hodnoty, charakteristiky), což je čitelnější, opakující se použitelný kód. Řekněme, že píšete program, kde je třeba sledovat více automobilů. Každé auto má jiné vlastnosti, jako je vzdálenost, barvu a nejvyšší rychlost, ale naštěstí pro nás mohou vykonávat některé společné akce, jako brzdění, zrychlování a otáčení. Namísto psaní kódu zvlášť pro každé auto bychom mohli vytvořit třídy s názvem 'auto', která bude "plánem" pro každý konkrétní vůz.
Konstrukce třídy
Třída je jméno dané k obecnému popisu objektu.V Pythonu můžete definovat metody třídy (akce, události, nebo funkce) podle následující struktury:
class <<Název_třídy>>:
...def <<název_metody>> (self [, <<volitelné argumenty>>]):
......<<kód_metody>>
První písmeno v názvu třídy by mělo být vždy veliké, je to běžně udávaný postup při programování aby se rozlišovali např. od názvu metody, který jak vidíte začíná malým písmenem. Avšak v případě Pythonu to není nutné. Dále "self" je v podstatě povinný přídavek. Je to jedna z vlastností, jak se odlišuje metoda od funkce. Funkce tam nemusí mít nic, kdežto metoda tam musí mít minimálně self. Více o tom později nebo jinde.
Pojďme se podrobně podívat. My definujeme naš objekt pomocí 'Class' klíčového slova, jména a vlastností. Definujeme tedy jeho metody, jako bychom definovali normální funkce.
class Auta:
...def brzda (self):
......print ("Brzdy")
...def zrychlit (self):
......print ("urychlení")
Toto je příklad zapouzdření (viz. předchozí tutoriál), kde jsou pokyny pro zpracování definovány jako část jiné struktury pro budoucí opětovné použití.
Použití tříd
Když chceme vytvořit potomka, resp. auto, nebo zavolat ne něj nějakou metodu, provádí se to takto:
auto1 = Auta() # auto1 je instancí třídy Auta (jak ji získat, viz. níže)
auto2 = Auta()
auto1.brzdi() # na auto1 zavolame metodu "brzdi" za použití tečkové syntaxe
Pomocí závorek ("volání" třídy) jazyka Python říká, že chcete vytvořit instanci třídy a ne jen kopírovat definice třídy. Bylo by třeba vytvořit proměnnou pro každý vůz. Nicméně, teď každé auto (objekt) může využívat metody třídy a atributy, takže nemusíte psát funkci brzdi a zrychli pro každé auto (objekt) samostatně.
Vlastnosti
Právě teď všechny vozy vypadají stejně, ale dejme jim některé vlastnosti k jejich rozlišení. Vlastnost je jen proměnná, která je specifická pro daný objekt. Chcete-li přiřadit vlastnost, napsali bychom to takto:
- auto1. barva = "Modra"
A získávat její hodnotu takto:
- print (auto1. barva)
Dobrá programovací taktika programování je psát funkce, získat a nastavit, vlastnosti, které nejsou 'Read-Only'. Například:
class Auta:
... Předchozí metody ...
...def nastav_vlastnika (self, Vlastnik_jmeno): # Toto umožní stanovit vlastníka
......self. _vlastnik = Vlastnik_jmeno
...def vlastnik (self): # Toto bude načítat vlastníka
...... return self. _vlastnik
Všimněte si, že podtrhnutí před názvem vlastnosti (což je způsob, jak skrýt názvy proměnných od uživatelů). Začátek od Python 2.2, můžete také definovat výše uvedeném příkladu tak, že vypadá jako normální proměnné:
Od verze 2.2, můžeme také definovat ve výše uvedeném příkladu tak, že vypadá jako normální proměnná: Class auta:
... předešlé metody ...
...vlastnik = property(vlastnik, nastav_vlastnika)
Speciální metody třídy
Constructor - metoda, která se zavolá vždy, když vytváříte novou instanci třídy. V Pythonu se vytváří konstruktor napsaním funkce __init__(2 podtržítka) jako název metody. To může dokonce přijmout argumenty, například pro nastavení hodnot atributů při vytvoření nové instance třídy. Například bychom mohli vytvořit objekt nové auto a nastavit jeho značku, model, rok a další atributy na jediném řádku.
class Nove_auto(Auto):
def __init__(self,znacka, model, rok): #definice vlastností
self.brand = znacka
self.model = model
self.year = rok
def start_auto(self): #Start motoru auta
print ("Auto je nastartováno!")
if __name__ == "__main__":# Vytvoří dvě instance Nove_auto, každou s unikátními vlastnostmi
auto1 = Nove_auto("Ford","F-150",2001)
auto2 = Nove_auto("Toyota","Corolla",2007)
auto1.start_auto()
auto2.start_auto()
Snad jste se k OOP přiblížili více a příště si ukážeme zase něco navíc :)