Definícia: Decorator je návrhový vzor v Pythone. Je to funkcia, ktorá vezme inú funkciu ako argument, pridá k nej nejaké funkcie bez toho, aby ich upravila, a vráti inú funkciu.
Tomu sa hovorí pomocou „(@)“ a umiestni sa pred definovanie funkcie, ktorú chceme zdobiť.
syntax:
@ meno dekoratéra
Definícia funkcie
Pre pochopenie dekoratérov musíme poznať nasledujúce koncepty.
Funkcie sú prvotriedne objekty. To znamená, že funkciu je možné odovzdať ako argument, vrátiť sa z inej funkcie, priradiť ju k premennej, definovať ju v inej funkcii. Pre lepšie pochopenie pozri nižšie uvedené príklady.
- Funkciu je možné odovzdať ako argument
Príklad: prírastok def (n):
návrat n + 1
def demo_funcall (funkcia):
num = 5
návratová funkcia (počet)
demo_funcall (prírastok)Tu funkcia prírastku prešla ako argument
príklad1.py:
Výkon:
>> python priklad1.py
- Funkciu je možné vrátiť z inej funkcie
Príklad: def wish ():
def say_wish ():
späť "Všetko najlepšie k narodeninám"
návrat say_wish
ahoj = želanie ()
Ahoj()príklad2.py:
Výkon:
>> python priklad2.py
Tu sa funkcia say_wish vrátila z funkcie želania - Funkciu je možné upraviť a priradiť k premennej
Príklad: def add (a, b):
návrat a + b
sum2nos = pridať # Tu je funkcia pridaná priradená k premennej
sum2nos (5,11)príklad3.py:
Výkon:
>> python example3.py
- Definujte funkciu vo vnútri inej funkcie
Príklad: def add (a, b):
def sum2 (a, b):
návrat a + b
res = suma2 (a, b)
návrat res
pridať (10,15)príklad4.py:
Výkon:
>> python priklad4.py
Uzáver:
Python umožňuje vnorenej funkcii prístup k vonkajšiemu rozsahu obklopujúcej funkcie.
def pozdrav (správa):„Enclosong Function“
def send_greeting ():
"Vnorená funkcia"
tlač (správa)
send_greeting ()
pozdrav („dobré ráno“)
príklad5.py:
Výkon:
>> python priklad5.py
Po pochopení vyššie uvedených pojmov teraz napíšeme príklad dekoratéra.
Pr1: Tu ozdobíme funkciu správy. Tlač správy vo vnútri **** bez úpravy pôvodnej funkcie, t.j.e., funkcia správy.
# štart dekorátoradef print_msg (funkcia):
def wrapper ():
funkcia ()
spätný obal
# dekorátor končí
správa def ():
tlač („Toto je prvý príklad na demonštráciu dekoratéra“)
ahoj = print_msg (správa)
Ahoj()
príklad6.py:
Výkon:
>> príklad pythonu6.py
V najjednoduchšej forme môžeme umiestniť dekorátor nad definíciu funkcie a vyvolať funkciu, ako je uvedené nižšie:
Na tento účel použite ľubovoľný reťazec, ktorý chceme vo vnútri *** vyzdobiť.
Výkon:
Viacnásobný dekorátor:
Pre jednu funkciu môžeme mať viac dekoratérov. Tu sa nanáša dekoratér v poradí, v akom sme ho volali.
syntax:
@ dekorator2
@ dekorator1
Definícia funkcie
Tu sa použije prvý dekoratér, potom druhý dekoratér.
Odovzdávanie argumentov funkciám dekoratéra:
Funkcii wrapper môžeme odovzdať argumenty. Argumenty odovzdané funkcii, ktorú chceme zdobiť.
Príklad:
def deco_wish (funkcia):def obal (arg1, arg2):
print ('Predané argumenty sú', arg1, arg2)
tlač („**********************“)
funkcia (arg1, arg2)
tlač ('**********************')
spätný obal
@deco_wish
def želanie (a1, a2):
tlač (a1, a2)
prianie („Dobré“, „Ráno“)
prianie („dobré“, „popoludnie“)
príklad7.py:
Výkon:
>> príklad pythonu7.py
Predajte premenný počet argumentov funkcii dekorátora:
Môžeme odovzdať ľubovoľný počet argumentov pomocou * args (argumenty, ktoré nie sú kľúčovými slovami, ako sú čísla) a ** kwargs (argumenty pre kľúčové slová, ako je slovník). Oba sú pozičnými argumentmi a ukladajú argumenty do premenných args a kwargs.
Poznámka: Tu môžeme namiesto args a kwargs použiť akýkoľvek názov, ale použitie týchto mien sa odporúča.
Príklad:
def dec_var_args (funkcia):def wrapper (* args, ** kwargs):
print ('Argumenty, ktoré nie sú kľúčovými slovami, sú', args)
print ('Argumenty kľúčového slova sú', kwargs)
funkcia (* args)
spätný obal
@ dec_var_args
def fun_non_key_args (* args):
pre I v args:
tlač (i)
@ dec_var_args
def fun_key_args ():
print („Argumenty kľúčového slova“)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
príklad8.py:
Výkon:
>> príklad pythonu8.py
Príklad 2: Predpokladajme, že máme 2 funkcie
Funkcia1: Vypočítajte súčet čísel z daného zoznamu
Funkcia2: Vynásobte každé číslo číslom 2 a pridajte ich do daného zoznamu čísel
Ak chceme vypočítať čas, ktorý každý potrebuje na vykonanie, môžeme to urobiť dvoma spôsobmi
- Umiestnite kód medzi čas začiatku a koniec každej funkcie
- Na výpočet času napíšte dekoratér
Nižšie uvedený kód vyriešený pomocou dekorátora:
# štart dekorátoraexe_time_calc (func):
def obal (arg):
start_time = datetime.Dátum Čas.teraz ()
func (arg)
end_time = dátum a čas.Dátum Čas.teraz ()
print ("Čas potrebný na vykonanie funkcie" + func.__name__ + "je" + str (end_time - end_time))
spätný obal
# dekorátor končí
@exe_time_calc
def cal_avg (údaje):
súčet = 0
pre údaje i:
suma + = i
print ("Priemer daného zoznamu čísel je", sum // len (data))
@exe_time_calc
def mul_by_2 (údaje):
súčet = 0
pre i v dátach:
suma + = + (i * 2)
print ("Súčet všetkých čísel po vynásobení 2 je", súčet)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
príklad9.py:
Výkon:
>> príklad pythonu9.py
Vyššie uvedený dekorátor je možné použiť na výpočet času vykonania ktorejkoľvek z funkcií. Použitím dekorátora môžeme zabrániť opakovaniu kódu, keď máme požiadavku na výpočet času vykonania umiestnenia dekorátora nad definíciu funkcie.
Záver:
Dekoranti menia funkčnosť funkcie / metódy bez zmeny pôvodného kódu funkcie, ktorá sa zdobí. Vďaka tomu sa môžeme vyhnúť opakovanému písaniu kódu. Poznanie konceptu maliara nás v pythone posilní. Dekorátor môžeme použiť v nasledujúcich prípadoch:
- Autorizácia v rámci Pythonu Ex: Flask a Django
- Protokolovanie
- Zmerajte čas vykonania