Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilRadovan Kovář
1
Objektově orientované programování
2
Objektově orientovaný přístup k programování je zcela jiný způsob přemýšlení. Jedná se o moderní styl programování, kterého se chytil softwarový průmysl. V poslední době bývá velmi často využíván při tvorbě většiny nového, komerčního i volně šiřitelného softwaru. Základní kamenem tohoto přístupu je objekt. Objektové programování je bráno jako složitější než to obyčejné (procedurální), o kterém jsme se doposud bavili. U větších projektů se tento přístup jeví jako nutnost. Kód bývá často delší, ale daleko přirozenější, přehlednější a jednodušeji se spravuje.
3
Objektově orientované programování funguje tím způsobem, že se snažíme nasimulovat realitu tak, jak ji jsme zvyklí vnímat. Můžeme tedy říci, že se odpoutáváme od toho, jak program vidí počítač (stroj) a píšeme program spíše z pohledu programátora (člověka). Jde tedy o určitou úroveň abstrakce nad programem. Základní jednotkou je objekt, který má své atributy a metody.
4
Atributy objektu jsou vlastnosti neboli data, která uchovává. Jedná se o prosté proměnné. Někdy o nich hovoříme jako o vnitřním stavu objektu. Metody jsou schopnosti, které umí objekt vykonávat. Mohou mít parametry nebo smějí vracet nějakou hodnotu. Každý objekt má nějaký typ, přičemž typy rozdělujeme na vestavěné (list, tuple, int,...) a třídy (definované pomocí klíčového slova class).
5
Typ určuje, jaké metody objekt nabízí, představuje jakousi šablonu (obecné vlastnosti), od které se pak individuální objekt liší vnitřním stavem (konkrétními vlastnostmi). Říkáme, že objekt je instancí daného typu. Pro zjištění typu objektu slouží vestavěná funkce type. Příklad: print(type("Python")) print isinstance(list(), list) # Funkce "isinstance" kontroluje typ objektu (včetně dědičnosti) True
6
Konstruktor je metoda, která inicializuje objekt - zavolá se na prázdném objektu ve chvíli, kdy vytvoříme novou instanci. Můžeme jej definovat, ale nemusíme - v takovém případě se použije výchozí konstruktor, který jednoduše nedělá nic (zvláštního). Konstruktor se v Pythonu vždy jmenuje __init__ (dvě podtržítka před i po slově).
7
Příklad: >>> class Complex: def __init__(self, realpart, imagpart): self.r = realpart self.i = imagpart >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5) Poznámka - slovíčko self je v podstatě povinný přídavek. Je to jedna z vlastností, jak se odlišuje metoda od funkce.
8
V Pythonu obecně jsou podtržítkové konvence velice silně zakořeněné. Na objektech to je vidět snad nejvíce. Atributy se dvěma podtžítky na začátku i na konci mají speciální význam. Už jsme viděli __init__ a podíváme se na několik dalších. __repr__ a __str__ - převádějí objekt na řetězec __getattr__ a __setattr__ - slouží pro čtení a ukládání nenalezených atributů __call__ - se zavolá pokud použijeme objekt jako funkci __doc__ - obsahuje dokumentaci (docstring)
9
Python příliš nerozlišuje mezi metodami a daty (tak jako obecně u proměnných - vše je objekt). Pro něj je vše atribut daného objektu. Nastavení hodnoty se provádí podobně jako ukládání do proměnné, ale musíme přidat objekt a tečku. Atribut daného jména nemusí přitom vůbec existovat, nemusí se nijak deklarovat. Vlastnosti jsou "chytřejší" data. Umožnují vstoupit do procesu čtení nebo nastavování atributu. Hodí se to například tehdy, pokud objekt má několik navzájem závislých parametrů a my je nechceme ukládat nezávisle; pokud chceme kontrolovat, jaká hodnota se ukládá; či pokud chceme s ukládanou nebo čtenou hodnotou ještě něco zajímavého provést.
10
Objektově orientované programování stojí na třech pilířích, jimiž jsou zapouzdření, dědičnost a polymorfismus. Zapouzdření umožňuje skrýt některé metody a atributy tak, aby zůstaly použitelné jen pro třídu zevnitř. Objekt si můžeme představit jako černou skřínku, která má určité rozhraní (interface), přes které jí předáváme instrukce/data a ona je zpracovává. Nevíme, jak to uvnitř funguje, ale víme, jak se navenek chová a používá. Nemůžeme tedy způsobit nějakou chybu, protože využíváme a vidíme jen to, co tvůrce třídy zpřístupnil.
11
Příklad zapouzdření: >>> class Auta: def brzda (self): print ("zpomaluje") def plyn (self): print ("zrychluje") Využitím klíčového slova class byl vytvořen název třídy (Auta). Poté se definovaly názvy metod (brzda, plyn) a kód metody (zpomaluje, zrychluje).
12
V návaznosti na předcházející kód, lze pak snadno (pomocí závorek) vytvořit instanci třídy. >>> auto1 = Auta() # auto1 je instancí třídy Auta >>> auto2 = Auta() # auto2 je instancí třídy Auta >>> auto1.brzda() zpomaluje >>> auto2.plyn() zrychluje Takto vzniklé objekty, v našem případě auto1 a auto2, pak mohou využívat metody třídy a atributy, takže nemusíme definovat funkci brzda a plyn pro každé auto samostatně.
13
Dědičnost je jedna ze základních vlastností objektově orientovaného programování a slouží k tvoření nových datových struktur na základě starých. Výhody dědění jsou jasné, nemusíme opisovat oběma třídám ty samé atributy, ale stačí dopsat jen to, v čem se liší. Zbytek se podědí. Můžeme tedy rozšiřovat existující komponenty o nové metody a tím je znovu využívat. Nemusíme psát spousty redundantního (duplikovaného) kódu. A hlavně pokud změníme jediný atribut v mateřské třídě, automaticky se tato změna projeví na ostatních. Nedochází tedy k pracnému ručnímu měnění a možnosti vzniku chyby.
14
Příklad dědičnosti (návaznost na předchozí příklad): >>> class Moderní_Auta (Auta): def klakson (self): print ("troubí") >>> auto3 = Moderní_Auta() >>> auto3.brzda() zpomaluje >>> auto3.plyn() zrychluje >>> auto3.klakson() troubí
15
O mateřské třídě se někdy hovoří jako o předkovi a o třídě, která z ní dědí, jako o potomkovi. Potomek může přidávat nové metody nebo si uzpůsobovat metody z mateřské třídy. Je možno se setkat také s pojmy nadtřída a podtřída. V objektovém modelování se dědičnost znázorňuje graficky jako prázdná šipka směřující k předkovi.
16
Třetím pilířem objektově orientovaného programování se budeme zabývat jen okrajově. Jedná se o polymorfismus, který umožňuje používat jednotné rozhraní pro práci s různými typy objektů. Jednoduše řečeno, dovoluje nám přepsat si metodu u každé podtřídy tak, aby konala, co se požaduje. Rozhraní tedy zůstane zachováno a nemusí se uvažovat, jak se to u onoho objektu volá. Podstatou polymorfismu je metoda nebo metody, které mají všichni potomci definované se stejnou hlavičkou, ale jiným tělem.
17
Příklad polymorfismu (návaznost na předchozí příklad): >>> class Veteráni (Moderní_Auta): def klakson (self): print ("upadl") >>> auto4 = Veteráni() >>> auto4.klakson() upadl >>> auto3.klakson() troubí
18
Děkuji za Vaši pozornost
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.