= Dekorátor ako trieda = Od dekorátora {{{skontroluj_cislo}}} chceme takéto správanie sa: Ak {{{f}}} je funkcia z dvomi parametrami {{{(request,cislo_int)}}}, {{{skontroluj_cislo(f)}}} má vrátiť volateľný objekt tiež s dvomi parametrami {{{(request,cislo)}}}, ktorý vykoná patričné kontroly parametra {{{cislo}}}, prevedie ho na {{{int}}} a ak všeko sedí, zavolá {{{f}}}. Iný spôsob ako toto zrealizovať je definovať dekorátor ako triedu. {{{#!python class skontroluj_cislo(object): """ * Teraz spravime dekorator ako triedu * Jej instancie su callable objekty, ktore sa chovaju * ako dekorovane funkcie * Konstruktor ocakava `f` ako parameter * Ako parameter ocakava funkciu `f(request,cislo)` * Jeho navratovou hodnotou je funkcia, ktora skontroluje cislo, ak je chybne vrati chybu, a ak je v poriadku, zavola `f`. """ def __init__(self,f): self.f=f def __call__(self,request,cislo): # cislo je retazec # musime ho previest na int # treba kontrolovat vstup uzivatela! try: cislo_int=int(cislo) except ValueError: return chyba("%s sa nepodarilo previest na cislo" % cislo) if cislo_int<0: return chyba("cislo %d je zaporne" % cislo_int) return self.f(request,cislo_int) }}} == Ako to funguje == Uvedomme si, že python pri dekorovaní urobí {{{nasobky=skontroluj_cislo(nasobky)}}}, čo teraz znamená vytvorenie inštancie triedy {{{skontroluj_cislo}}}, ktorá sa volá {{{nasobky}}}. To znamená, že sa zavolá {{{__init___}}}. Ak sa potom narazí na volanie {{{nasobky(request,cislo)}}}, python zistí, že objekt {{{nasobky}}} je inštanciou triedy, ktorá implementuje metódu {{{___call___}}}. To znamená, že inštancie tejto triedy sú volateľné. Dôjde teda nakoniec k volaniu {{{skontroluj_cislo.__call__(nasobky,request,cislo)}}}.