Objektově orientované programování v jazyce Python Základní pojmy objektově orientovaného programování Objekt – vychází z reálného světa. Má dva charakteristické rysy.
Všechny objekty mají stav
Všechny objekty mají chování
Objekt má své vlastnosti a může vykonávat určité činnosti. Každý objekt je instancí třídy objektů. Třída objektu definuje množinu činností, které mají všechny objekty této třídy společné. Jednotlivé objekty stejné třídy se od sebe tedy liší pouze hodnotami vlastností. Třída - Třída je základní konstrukční prvek objektově orientovaného programování. Třída slouží k vytváření objektů. Pomocí třídy definujeme vlastnosti a metody objektu. Atribut – určuje vlastnost objektu. Metoda – je funkce přidružená k určité třídě.
Python je objektově orientovaný jazyk. V této kapitole se budeme zabývat: a) Dědičností b) Vícenásobnou dědičností c) Polymorfismem d) Zapouzdřením
Objekty nejsou jenom instance třídy, ale i samotná třída je objekt v Pythonu. Mezi objekty v Pythonu patří moduly, uživatelské funkce.
Definování třídy Třída se v Pythonu definuje pomocí konstrukce class. Popis této konstrukce si lépe představíme na následujícím příkladu.
-1-
class auto: def __init__(self, z = ’Fiat’): self.znacka = z def ukazZnacku(self): print ’Toto je auto:’, self print ’Znacka:’, self.barva
Po klíčovém slovu class následuje libovolný název třídy. Stejně v jako jiných konstrukcích tak i tady následuje odsazení. Poté co odsadíme, můžeme definovat funkci.
Dědičnost Dědičnost je velice využívaná, kvůli zjednodušení a lepší orientaci v kódu a ušetření práce programátorům. Vysvětlil bych to opět na příkladu, kde využijeme předcházející ukázku. class SUV (auto):
def __init__(self, z = 4x4):
auto.__init__(self, znacka = ’Fiat’) self.zaber = z def ukaz(self):
auto.ukazZnacku(self) print ’Typ auta:’, self.zaber
autoDoTerenu = SUV()
-2-
autoDoTerenu.ukaz()
Zavolání a výpis bude vypadat takto:
Toto je auto: <__main__.AutoDoTerenu instance at 0x82a6a8c> znacka: fiat zaber: 4x4
Pokud bychom chtěli použít vícenásobnou dědičnost, pak bychom byli nuceni dopsat do závorek k příkazu class SUV (auto): , jednotlivé rodičovské třídy oddělené čárkami.
Postup Pythonu, při hledání atributu Python nejdříve projde třídu objektu. Následně pokračuje prohledáváním první rodičovské třídy stejné třídy. Stejný princip se aplikuje i na předky této třídy. Pokud je však atribut nenalezen, přesune se na další rodičovské třídy. Pokud nastane varianta, že interpret nenajde žádný hledaný atribut, vyvolá se výjimka. Nastane- li situace a bude chtít volat metodu z některých rodičovských tříd, použijeme zápis. Chceme-li volat metodu některé z rodičovských tříd, použijeme zápis podobný tomu, jako je těmto: auto.ukazZnacku(self) . Zde voláme funkci ukazZnacku, která se nachází ve třídě auto a je součástí objektu self. -3-
Třídní a statické metody Novinkou, co se týče Pythonu, jsou třídní a statické metody. Třídní metoda je metoda, která dostane místo instance, třídu samotnou. Dostane ovšem první argument. U třídní metody není důležité, jestli je volána jako metoda instance nebo funkce, která je definována ve funkci. Pokud vytvoříme metodu, která bude třídní, vytvoříme vlastně klasickou funkci. Tato funkce bude obsahovat jako první argument, odkaz na třídu a poté se s funkcí classmethod() zkonvertuje. Statické metody jsou takové metody, které nepříbírají žádný argument, v němž je instance nebo třída. Mohli by jsme si to představit jako funkce, které jsou definované ve třídě. Jejich sestrojení je obdobné jako u předchozího typu metod. Místo funkce classmethod() použijeme funkci staticmethod().
Bibliografie ŠVEC, Jan. Učebnice jazyka Python (aneb Létající cirkus) [online]. 16.prosince.2002 [cit. 2009-12-01]. Dostupný z WWW:
. ŠVEC, Jan. Létající cirkus,Python tutoriál [online]. 13.února.2003 [cit. 2009-12-15]. Dostupný z WWW: < http://i.iinfo.cz/r/old/data/letajici_cirkus.pdf>.
-4-
Ověření znalostí z kapitoly 4 - Objektově orientované programování v jazyce Python 1. Patří mezi objekt v Pythonu modul? a) Ano b) Ne c) Nevím 2. Jak může přistupovat k atributům? a) public b) private c) public i private 3. Je součástí objektově orientovaného programování v Pythonu dědičnost? a) Ano b) Ne c) Ano, ale ne v Pythonu
-5-