Definice: Decorator je návrhový vzor v Pythonu. Je to funkce, která bere jinou funkci jako argument, přidá k ní některé funkce bez úpravy a vrátí jinou funkci.
Tomu se říká „(@)“ a umístí se před definování funkce, kterou chceme zdobit.
syntax:
@ jméno dekora
Definice funkce
Pro pochopení dekoratérů potřebujeme znát níže uvedené pojmy.
Funkce jsou prvotřídní objekty. To znamená, že funkci lze předat jako argument, lze ji vrátit z jiné funkce, lze ji přiřadit k proměnné, lze ji definovat v jiné funkci. Pro lepší pochopení viz níže uvedené příklady.
- Funkci lze předat jako argument
Příklad: přírůstek def (n):
návrat n + 1
def demo_funcall (funkce):
num = 5
návratová funkce (počet)
demo_funcall (přírůstek)Zde byla funkce přírůstku předána jako argument
příklad1.py:
Výstup:
>> python příklad1.py
- Funkci lze vrátit z jiné funkce
Příklad: def přání ():
def say_wish ():
zpět "Všechno nejlepší k narozeninám"
návrat say_wish
ahoj = přání ()
Ahoj()příklad2.py:
Výstup:
>> python příklad2.py
Zde se funkce say_wish vrátila z funkce přání - Funkci lze upravit a přiřadit proměnné
Příklad: def add (a, b):
vrátit a + b
sum2nos = add # Zde je přidána funkce přidělená proměnné
sum2nos (5,11)příklad3.py:
Výstup:
>> příklad pythonu3.py
- Definujte funkci uvnitř jiné funkce
Příklad: def add (a, b):
def součet2 (a, b):
vrátit a + b
res = součet2 (a, b)
návrat res
přidat (10,15)příklad4.py:
Výstup:
>> python příklad4.py
Uzavření:
Python umožňuje vnořené funkci přístup k vnějšímu rozsahu obklopující funkce.
def pozdrav (zpráva):„Enclosong Function“
def send_greeting ():
"Vnořená funkce"
tisk (zpráva)
poslat pozdrav()
pozdrav („Dobré ráno“)
příklad5.py:
Výstup:
>> python příklad5.py
Po pochopení výše uvedených konceptů nyní napíšeme příklad dekorátoru.
Příklad 1: Zde vyzdobíme funkci zprávy. Tisk zprávy uvnitř **** bez úpravy původní funkce, tj.E., funkce zprávy.
# start dekorátorudef print_msg (funkce):
def wrapper ():
funkce()
zpětný obal
# dekoratér konec
zpráva def ():
tisk („Toto je první příklad pro demonstraci dekoratéra“)
ahoj = print_msg (zpráva)
Ahoj()
příklad6.py:
Výstup:
>> příklad pythonu6.py
V nejjednodušší formě můžeme umístit dekorátor nad definici funkce a volat funkci, jak je znázorněno níže:
Zde bez ohledu na řetězec, který chceme vyzdobit uvnitř ***, použijte tento dekorátor.
Výstup:
Vícenásobný dekorátor:
Pro jednu funkci můžeme mít více dekoratérů. Zde se aplikuje dekorátor v pořadí, v jakém jsme ho volali.
syntax:
@ dekorátor2
@ dekorátor1
Definice funkce
Zde bude aplikován první dekoratér, poté druhý dekorátor.
Předávání argumentů funkcím dekorátoru:
Funkci wrapper můžeme předat argumenty. Argumenty předané funkci, pro kterou chceme zdobit.
Příklad:
def deco_wish (funkce):def wrapper (arg1, arg2):
print ('Předané argumenty jsou', arg1, arg2)
tisk ('*********************')
funkce (arg1, arg2)
tisk ('*********************')
zpětný obal
@deco_wish
def přání (a1, a2):
tisk (a1, a2)
přání ('Dobré', 'Ráno')
přání („dobré“, „odpoledne“)
příklad7.py:
Výstup:
>> příklad pythonu7.py
Předat proměnný počet argumentů funkci dekoratéru:
Můžeme předat libovolný počet argumentů pomocí * args (argumenty bez klíčových slov jako čísla) a ** kwargs (argumenty klíčových slov jako slovník). Oba jsou poziční argumenty a ukládají argumenty do proměnných args a kwargs.
Poznámka: Zde můžeme použít libovolný název namísto args a kwargs, ale použití těchto jmen se doporučuje.
Příklad:
def dec_var_args (funkce):def wrapper (* args, ** kwargs):
print ('Argumenty bez klíčových slov jsou', args)
print ('Argumenty klíčových slov jsou', kwargs)
funkce (* args)
zpětný obal
@ dec_var_args
def fun_non_key_args (* args):
pro I v args:
tisk (i)
@ dec_var_args
def fun_key_args ():
tisk („Argumenty klíčových slov“)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
příklad8.py:
Výstup:
>> příklad pythonu8.py
Příklad 2: Předpokládejme, že máme 2 funkce
Funkce 1: Vypočítejte součet čísel z daného seznamu
Funkce 2: Vynásobte každé číslo 2 a přidejte je do daného seznamu čísel
Pokud chceme vypočítat čas, který každý potřebuje na provedení, můžeme to udělat dvěma způsoby
- Umístěte kód mezi počáteční a koncový čas v každé funkci
- Napište dekorátor pro výpočet času
Viz níže kód vyřešený pomocí dekorátoru:
# start dekorátoruexe_time_calc (funkce):
def obal (arg):
start_time = datetime.čas schůzky.Nyní()
func (arg)
end_time = datetime.čas schůzky.Nyní()
print ("Čas potřebný k provedení funkce" + func.__name__ + "je" + str (end_time - end_time))
zpětný obal
# dekoratér konec
@exe_time_calc
def cal_avg (data):
součet = 0
pro i v datech:
součet + = i
print ("Průměr daného seznamu čísel je", sum // len (data))
@exe_time_calc
def mul_by_2 (data):
součet = 0
pro i v datech:
součet + = + (i * 2)
print ("Součet všech čísel po vynásobení 2 je", součet)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
příklad9.py:
Výstup:
>> příklad pythonu9.py
Výše uvedený dekorátor lze použít k výpočtu doby provádění pro kteroukoli z funkcí. Použitím dekorátoru se můžeme vyhnout opakovanému kódu, když máme požadavek na výpočet doby provádění, abychom dekorátor umístili nad definici funkce.
Závěr:
Dekoratéři mění funkčnost funkce / metody, aniž by změnili původní kód funkce, která se zdobí. Díky tomu se můžeme vyhnout psaní opakovaného kódu. Znalost konceptu dekoratéra nás v pythonu zesílí. Můžeme použít dekoratér v následujících případech:
- Autorizace v rámci Pythonu Ex: Flask a Django
- Protokolování
- Změřte čas provedení