1 2 | ||
Editor: Radek
Time: 2011/02/16 16:25:49 GMT+1 |
||
Note: Oprava zápisu kódu |
changed: - Dekorátory funkcií ================== Ak máme naprogramované funkcie a chceme ich vylepšiť pridaním nejakej novej vlastnosti, môžeme prepísať pôvodnú funkciu alebo použiť dekorátor. Dekorovať znamená ozdobiť, takže budeme funkciu nejako ozdobovať novým kódom. Vytvorenie dekorátora --------------------- Dekorátor je funkcia, ktorá má parameter funkciu a vracia novú (vylepšenú, dekorovanú) funkciu. Príklad zápisu jednoduchého dekorátora, ktorý modifikuje funkcie bez parametra:: def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy povodna_funkcia() #prikazy return novafunkcia Ak povodna_funkcia vracia hodnotu pomocou return, v definícii dekorátora to musíme zohladniť:: def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy return povodna_funkcia() return novafunkcia Použitie dekorátora -------------------- Dekorátor sa používa tak, že nad názov funkcie napíšeme názov dekorátora so symbolom @:: @nazov_dekoratora def f(parametre funkcie): #prikazy Príklad 1 -------- Vytvoríme jednoduchý dekorátor, ktorý funkcie bez parametra obohatí o výpis 's dekoratorom':: def dekorator(povodna_funkcia): def novafunkcia(): povodna_funkcia() print 's dekoratorom' return novafunkcia Definícia novej funkcie s dekorátorom:: @dekorator def f(): print 'funkcia' Zavoláme funkciu f:: f() Vypise:: >>funkcia >>s dekoratorom Príklad 2 ------------------- Urobíme dekorátor, ktorý ak sa vyskytne chyba, odchytí ju a niečo vypíše. Zamedzíme tak chybovým hlaseniam interpretera. Urobíme dekorátor tak, aby pracoval s funkciami, ktoré majú ľubovoľné parametre.:: def osetrene_chyby(funkcia): def nova(*args,**kwargs): try: return funkcia(*args,**kwargs) except: print 'chyba' return nova Definujme nejaku funkciu, v ktorej by sa vypísalo chybové hlásenie.:: @osetrene_chyby def ff(nejaky_text): print nejaky_text print 1/0 ff('Python podporuje dekoratory!') Vypíše:: >>Python podporuje dekoratory! >>chyba From Radek Wed Feb 16 16:23:58 +0100 2011 From: Radek Date: Wed, 16 Feb 2011 16:23:58 +0100 Subject: Message-ID: <20110216162358+0100@www.py.cz> Pokud dekorovaná fuknce vrací hodnotu v return, pak to v dekorátoru zohledníme:: def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy result = povodna_funkcia() #prikazy return result return novafunkcia
Ak máme naprogramované funkcie a chceme ich vylepšiť pridaním nejakej novej vlastnosti, môžeme prepísať pôvodnú funkciu alebo použiť dekorátor. Dekorovať znamená ozdobiť, takže budeme funkciu nejako ozdobovať novým kódom.
Dekorátor je funkcia, ktorá má parameter funkciu a vracia novú (vylepšenú, dekorovanú) funkciu.
Príklad zápisu jednoduchého dekorátora, ktorý modifikuje funkcie bez parametra:
def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy povodna_funkcia() #prikazy return novafunkcia
Ak povodna_funkcia vracia hodnotu pomocou return, v definícii dekorátora to musíme zohladniť:
def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy return povodna_funkcia() return novafunkcia
Dekorátor sa používa tak, že nad názov funkcie napíšeme názov dekorátora so symbolom @:
@nazov_dekoratora def f(parametre funkcie): #prikazy
Vytvoríme jednoduchý dekorátor, ktorý funkcie bez parametra obohatí o výpis 's dekoratorom':
def dekorator(povodna_funkcia): def novafunkcia(): povodna_funkcia() print 's dekoratorom' return novafunkcia
Definícia novej funkcie s dekorátorom:
@dekorator def f(): print 'funkcia'
Zavoláme funkciu f:
f()
Vypise:
>>funkcia >>s dekoratorom
Urobíme dekorátor, ktorý ak sa vyskytne chyba, odchytí ju a niečo vypíše. Zamedzíme tak chybovým hlaseniam interpretera. Urobíme dekorátor tak, aby pracoval s funkciami, ktoré majú ľubovoľné parametre.:
def osetrene_chyby(funkcia): def nova(*args,**kwargs): try: return funkcia(*args,**kwargs) except: print 'chyba' return nova
Definujme nejaku funkciu, v ktorej by sa vypísalo chybové hlásenie.:
@osetrene_chyby def ff(nejaky_text): print nejaky_text print 1/0 ff('Python podporuje dekoratory!')
Vypíše:
>>Python podporuje dekoratory! >>chyba
... --Radek, Wed, 16 Feb 2011 16:23:58 +0100 reply
Pokud dekorovaná fuknce vrací hodnotu v return, pak to v dekorátoru zohledníme:
def nazov_dekoratora(povodna_funkcia): def novafunkcia(): #prikazy result = povodna_funkcia() #prikazy return result return novafunkcia