Čtenář neznalý objektového oreientovaného programování by v tomto okamžiku měl ulapit zkušenějšího kolegu či nějakou knihu. Je mnoho lidí, kteří dokážou vysvětlit OOP lépe než já.
Oproti tomu čtenář znalý objektového programování si jistě všiml, že standardní datové struktury (zejména seznamy) se chovají nápadně podobně jako objekty. Je to tím, že to objekty jsou. Kromě toho je možné definovat i vlastní třídy a vytvářet jejich instance.
Definice třídy se provádí celkem srozumitelně, následující kousek programu definuje třídu Queue, která implementuje frontu.
class Queue:
"Queue - implementace fronty"
def __init__(self):
self._data = []
def put(self, i):
"Queue.put(i)\n přidá do fronty objekt"
self._data[:0] = [i]
def get(self):
"Queue.get()\n vrátí objekt z fronty"
return self._data.pop()
def is_empty(self):
"Queue.is_empty()\n vrací 1 je-li fronta prázdná"
return not self._data
Máme-li definovanou třídu, můžeme vytvářet objekty (instance) této třídy, instance mají metody, které se dají volat.
>>> q = Queue()
>>> q.is_empty()
1
>>> q.put(2)
>>> q.put('s')
>>> q.get()
2
>>> q.is_empty()
0
Za zmínku stojí ``magický'' parametr self
, který je použit ve všech
metodách. Tento parametr reprezentuje aktuální instanci objektu, pro
kterou je metoda vyvolána. Má-li metoda pracovat s instancí, používá se
přístupu přes parametr self
Python používá pro označení speciálních metod (konstruktory, destruktory
a mnohé jiné) zvláštní jména. Metoda, která se jmenuje __init__
se
volá při vytváření objektu, metoda pojmenovaná __del__
se používá při
jeho rušení. Konstruktor __init__
byla použita v předchozím
příkladu.
Pomocí metod se speciálním názvem je možné ovlivňovat jak se bude objekt
převádět na řetězec (a tedy tisknout pomocí print
u), je možné
přetěžovat operátory a další užitečné věci. Pro přesnější popis je
vhodné prozkoumat
originální dokumentaci k Pythonu.
Je samozřejmě možné vytvářet i následnické třídy. Předpokládám, že čtenář je OOP znalý a s Pythonem se sžil natolik, že pochopí následující kousek kódu.
class DEQueue(Queue):
"DEQueue - Oboustranně ukončená fronta"
def __init__(self):
Queue.__init__(self) # zděděný konstruktor
def pop(self):
"DEQueue.pop()\n vytáhne prvek z vkládacího konce fronty"
retval = self._data[0]
del self._data[0]
return retval
def __len__(self):
# Umožňuje zjisti délku fronty pomocí funkce len()
return len(self._data)
Výšeuvedený kód vytvořil třídu DEQueue
, jejíž objekty se liší od
objektů třídy Queue
tím, že existuje metoda pop
, která
vybere poslední vložený znak. Navíc je možné použít na takto objekty
takto definované třídy vestavěnou funkci len()
, která korektně
vrátí délku fronty.
Vícenásobnou dědičnost je vhodné opět konzultovat s dokumentací.