Další Předchozí Obsah

10. Třídy, objekty

10.1 Definice nových tříd

Č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

10.2 Podivně pojmenované metody

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í printu), 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.

10.3 Dědičnost

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í.


Další Předchozí Obsah