Objektově orientované
programování (OOP) – principy,
praxe a příklady v Pythonu
Objektově orientované programování (OOP) patří mezi nejrozšířenější přístupy k tvorbě software. Jeho základem je myšlenka, že program lze modelovat podobně jako reálný svět – pomocí objektů, které mají stav (data) a chování (metody). Tento přístup přináší vyšší přehlednost, snadnější údržbu a opakovanou použitelnost kódu.
Proč používat OOP
Při vývoji složitějších aplikací rychle narazíme na problém přehlednosti a organizace kódu. OOP nám umožňuje:
Lépe strukturovat kód – logické celky (třídy) odpovídají entitám problému.
Zapouzdřit data a chování – chránit vnitřní stav objektu před nechtěnými změnami.
Usnadnit údržbu a rozšiřování aplikace – díky dědičnosti a polymorfismu lze přidávat nové funkce bez zásadního zásahu do existujícího kódu.
Čtyři základní principy OOP
Zapouzdření (Encapsulation)
Zapouzdření znamená, že vnitřní stav objektu je přístupný pouze přes definované metody.
Příklad v Pythonu:
class BankovniUcet:
def __init__(self, majitel, zustatek=0):
self.__majitel = majitel # soukromý atribut
self.__zustatek = zustatek
def vloz(self, castka):
if castka > 0:
self.__zustatek += castka
else:
raise ValueError("Částka musí být kladná")
def vyber(self, castka):
if 0 < castka <= self.__zustatek:
self.__zustatek -= castka
else:
raise ValueError("Nedostatek prostředků")
def zobraz_stav(self):
return f"Aktuální zůstatek: {self.__zustatek} Kč"
ucet = BankovniUcet("Jan Novák", 1000)
ucet.vloz(500)
print(ucet.zobraz_stav())
Abstrakce (Abstraction)
Abstrakce skrývá detaily implementace a odhaluje pouze potřebné rozhraní. V Pythonu ji můžeme dosáhnout pomocí abstraktních tříd.
Příklad v Pythonu:
from abc import ABC, abstractmethod
class Platba(ABC):
@abstractmethod
def zaplat(self, castka):
pass
class PlatbaKartou(Platba):
def zaplat(self, castka):
print(f"Platba kartou: {castka} Kč")
class PlatbaHotove(Platba):
def zaplat(self, castka):
print(f"Platba hotově: {castka} Kč")
platba = PlatbaKartou()
platba.zaplat(250)
Dědičnost (Inheritance)
Dědičnost umožňuje vytvářet nové třídy z existujících a přebírat jejich vlastnosti i metody.
Příklad v Pythonu:
class Zivocich:
def __init__(self, jmeno):
self.jmeno = jmeno
def pohyb(self):
print(f"{self.jmeno} se pohybuje")
class Pes(Zivocich):
def pohyb(self):
print(f"{self.jmeno} běží po čtyřech")
class Pták(Zivocich):
def pohyb(self):
print(f"{self.jmeno} letí")
pes = Pes("Azor")
ptak = Pták("Papoušek")
pes.pohyb()
ptak.pohyb()
Polymorfismus (Polymorphism)
Polymorfismus znamená, že různé třídy mohou poskytovat vlastní implementaci stejné metody.
Příklad v Pythonu:
zvirata = [Pes("Baryk"), Pták("Kakadu")]
for zvire in zvirata:
zvire.pohyb() # stejný název metody, různé chování
Koncepce před dědičnosti
Namísto složitých hierarchií tříd se doporučuje objekty skládat.
Příklad v Pythonu:
class Motor:
def start(self):
print("Motor nastartován")
class Auto:
def __init__(self):
self.motor = Motor()
def jed(self):
self.motor.start()
print("Auto jede")
auto = Auto()
auto.jed()
OOP a návrhové principy (SOLID)
OOP úzce souvisí s principy SOLID, které pomáhají navrhovat udržitelné aplikace:
S – Single Responsibility (jedna zodpovědnost na třídu)
O – Open/Closed (rozšiřitelný, ale neměnný kód)
L – Liskov Substitution (potomek nesmí měnit význam metod předka)
I – Interface Segregation (malá a specializovaná rozhraní)
D – Dependency Inversion (závislost na abstrakci, ne na konkrétní implementaci)
Výhody a nevýhody OOP
Výhody:
Lepší přehlednost a struktura kódu
Snazší údržba a testování
Opětovná použitelnost kódu
Nevýhody:
Vyšší počáteční náročnost pro začátečníky
Při špatném návrhu může vést k příliš složité struktuře tříd
OOP v praxi – mini projekt v Pythonu
Ukázka jednoduché aplikace objednávkového systému:
class Produkt:
def __init__(self, nazev, cena):
self.nazev = nazev
self.cena = cena
class Objednavka:
def __init__(self):
self.produkty = []
def pridat_produkt(self, produkt):
self.produkty.append(produkt)
def celkova_cena(self):
return sum(p.cena for p in self.produkty)
p1 = Produkt("Notebook", 25000)
p2 = Produkt("Myš", 500)
obj = Objednavka()
obj.pridat_produkt(p1)
obj.pridat_produkt(p2)
print(f"Cena objednávky: {obj.celkova_cena()} Kč")
OOP umožňuje strukturovat aplikace podle logických celků a realitě blízkých objektů. Správným využitím čtyř pilířů – zapouzdření, abstrakce, dědičnosti a polymorfismu – lze dosáhnout kódu, který je čistý, snadno udržovatelný a připravený na budoucí změny.
Zdroje
GAMMA, E., Helm, R., Johnson, R., Vlissides, J. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994. ISBN 0-201-63361-2.
LARMAN, C. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design. Prentice Hall, 2004. ISBN 978-0131489066.
McCONNELL, S. Code Complete. Microsoft Press, 2004. ISBN 978-0735619678.
MARTIN, R. C. Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall, 2008. ISBN 978-0132350884.
PUBLIKOVÁNO
24.08.2025, 17:30
ODKAZ
https://www.weloveit.education/Article/20250824-Objektove-orientovane-programovani-principy-praxe-a-priklady-v-Pythonu/