přihlásit 5497/530244

Objektově orientovaný

Existují různá paradigma programování. Lze se nejčastěji setkat s programováním strukturovaným (procedurálním), objektově orientovaným a funkcionálním. Programovací jazyk bývá obvykle navržen na základě jedno paradigma (má pro něj podporu v syntaxi, konstrukcích a podobně) a ty ostatní se v něm nedají používat vůbec a nebo jen těžkopádně. Například jazyk C umožňuje procedurální programování a Java zase objektově orientované. Jazyk PHP umožňuje struktorované i objektově orientované programování, ale OOP má implementované velmi slabě.

Python je objektově implementovaný (všechno v něm je objekt). Ale podporuje dobře jak objektově orientované tak i strukturované programování. Krom toho umožňuje používat i některé užitečné techniky známé z funkcionálního programování. Je to tedy taková všehochuť, něco jako když pejsek s kočičkou vařili dort. Python ale uvařili velmi dobří kuchaři, a tyto různé vlastnosti zkombinovali velmi umně a chutně.

To je užitečné, protože objektově orientované programování (OOP) je poněkud abstraktní a s výhodou se uplatní až u větších projektů. U drobných věcí je to pověstný kanón na vrabce a jeho nevýhody převažují nad výhodami. U drobnějších věcí se lépe uplatní procedurální technika. Pythonu nám tak nabízí větší flexibilitu v návrhu programu, protože se umí oproti jiným jazykům lépe přizpůsobit potřebám a osobním preferencím. Díky tomu pokrývá větší spektrum úloh, na jejichž řešení se hodí.

Hlavní rozdíl mezi OOP a procedurálním programováním se dá laicky poposat tak, že v procedurálním programování máme samostatná data, která se zpracovávají samostatnými funkcemi (procedury), jenž vytváříme a které mají jeden vstup a jeden výstup. V OOP oproti tomu máme objekty, které sdružují data a funkce, které s nimi pracují, v jeden celek - objekt (nazývá se to zapouzdření). Objekt může mít řadu vstupů i výstupů a může si pamatovat i svoji historii.

Objekty se vytváří na základě jakési šablony, které se nazývají třídy. Třídu je také možno vnímat jako uživatelsky definované komplexní datové typy. Z jedné třídy je možno odvodit podtřídy, které rodičovskou třídu specializují (například z třídy číslo by mohly vzniknout podtřídy celé číslo, desetinné číslo a komplexní číslo). Takto mohou vzniknout rozsáhlé hierarchie tříd. Je to velmi výhodné při práci s rozsáhlou sadou datových typů, které mají cosi společného, protože potřebujeme-li upravit nějakou společnou vlastnost, stačí upravit rodičovskou třídu a všichni její potomci (a potomci těchto potomků a tak dále) tuto úpravu zdědí. Toho využívají například snad všechny GUI toolkity (knihovny pro vytváření grafického uživatelského rozhraní).

Návrh objektově orientovaného programu, celý systém hierarchie tříd a podobně je náročnější, než návrh procedurálního programu. Je potřeba myslet dopředu a mít s programováním nějaké zkušenosti. Proto je lepší se začít učit programovat na nějakém procedurálním jazyku. U Pythonu je výhodou, že v něm můžeme začít programovat procedurálně a postupně plynule přejít na objektový návrh. Je to lepší, než se začít učit něco nového. Je nutno říct, že OOP a jeho principy jsou především teoretická záležitost, kterou každý OOP jazyk podporuje trochu jinak a po svém a na různé úrovni.

Implementace OOP v Pythonu na docela dobré úrovni. Podporuje vícenásobnou dědičnost (narozdíl od Javy, C#) i přetěžování operátorů (na rozdíl od Javy). Nepodporuje ale řízení přístupu ke členům objektů (na rozdíl od většiny kompilovaných OOP jazyků). Všechny členy objektů jsou public, jen pomocí mangling metody umožňuje jejich skrytí. Díky tomu, že Python je dynamický jazyk, tak i třída samotná je v Pythonu objekt, tedy datový prvek. To umožňuje vytváření nových tříd přímo za běhu programu a podobně.