Definisjon: Dekoratør er et designmønster i Python. Det er en funksjon som tar en annen funksjon som et argument, legger til litt funksjonalitet i den uten å endre den, og returnerer en annen funksjon.
Dette kalles å bruke “(@)” og plasseres før du definerer en funksjon som vi vil dekorere.
syntaks:
@decorator navn
Funksjonsdefinisjon
For å forstå dekoratører, må vi kjenne til begrepene nedenfor.
Funksjoner er førsteklasses objekter. Det betyr at en funksjon kan sendes som et argument, kan returneres fra en annen funksjon, kan tilordnes en variabel, kan defineres i en annen funksjon. For bedre forståelse, se eksemplene nedenfor.
- En funksjon kan overføres som et argument
Eks: def inkrement (n):
returner n + 1
def demo_funcall (funksjon):
num = 5
returfunksjon (num)
demo_funcall (inkrement)Her passerte inkrement-funksjonen som et argument
eksempel1.py:
Produksjon:
>> pythoneksempel1.py
- Funksjon kan returneres fra en annen funksjon
Eks: def ønske ():
def say_wish ():
returner "Gratulerer med dagen"
tilbake si_ønsk
hei = ønske ()
Hallo()eksempel2.py:
Produksjon:
>> pythoneksempel2.py
Her say_wish funksjon returnert fra ønskefunksjonen - Funksjonen kan endres og tilordnes en variabel
Eks: def add (a, b):
returner a + b
sum2nos = add # Her funksjonen add tilordnet variabelen
sum2nos (5,11)eksempel3.py:
Produksjon:
>> pythoneksempel3.py
- Definer funksjon i en annen funksjon
Eks: def add (a, b):
def sum2 (a, b):
returner a + b
res = sum2 (a, b)
retur res
legg til (10,15)eksempel4.py:
Produksjon:
>> pythoneksempel4.py
Lukking:
Python lar en nestet funksjon få tilgang til det ytre omfanget av den omsluttende funksjonen.
def hilsen (melding):"Enclosong Function"
def send_greeting ():
"Nestet funksjon"
skriv ut (melding)
Send hilsen()
hilsen ("God morgen")
eksempel5.py:
Produksjon:
>> pythoneksempel5.py
Etter å ha forstått de ovennevnte konseptene nå, vil vi skrive et dekorasjonseksempel.
Eks1: Her vil vi dekorere meldingsfunksjonen. Skriver ut msg inni **** uten å endre den opprinnelige funksjonen, i.e., meldingsfunksjon.
#decorator startdef print_msg (funksjon):
def innpakning ():
funksjon()
returemballasje
#decorator end
def-melding ():
utskrift ("Dette er første eksempel for å demonstrere dekoratør")
hei = print_msg (melding)
Hallo()
eksempel6.py:
Produksjon:
>> pythoneksempel6.py
I den enkleste formen kan vi plassere dekoratør på toppen av funksjonsdefinisjonen og kalle funksjonen som vist nedenfor:
Her uansett streng vi ønsker å dekorere inni ***, bruk denne dekoratøren.
Produksjon:
Flere dekoratører:
Vi kan ha flere dekoratører for en enkelt funksjon. Her påføres dekoratøren i den rekkefølgen vi ringte.
syntaks:
@ dekoratør2
@ dekoratør1
Funksjonsdefinisjon
Her blir 1. dekoratør brukt, deretter 2. dekoratør.
Overføring av argumenter til dekoratørfunksjoner:
Vi kan overføre argumenter til innpakningsfunksjonen. Argumentene ble sendt til funksjonen som vi vil dekorere for.
Eks:
def deco_wish (funksjon):def-innpakning (arg1, arg2):
print ('De godkjente argumentene er', arg1, arg2)
skrive ut ('*********************')
funksjon (arg1, arg2)
skrive ut ('*********************')
returemballasje
@deco_wish
def ønske (a1, a2):
skriv ut (a1, a2)
ønsker ('God', 'Morgen')
ønsker ('God', 'Ettermiddag')
eksempel7.py:
Produksjon:
>> pythoneksempel7.py
Gi variabelt antall argumenter til dekoratørfunksjonen:
Vi kan sende et hvilket som helst antall argumenter ved hjelp av * args (ikke-søkeordargumenter som tall) og ** kwargs (søkeordargumenter som en ordbok). Begge er posisjonsargumenter og lagrer argumentene i args- og kwargs-variabler.
Merk: Her kan vi bruke hvilket som helst navn i stedet for args og kwargs, men disse navnene anbefales å bruke.
Eks:
def dec_var_args (funtion):def wrapper (* args, ** kwargs):
skriv ut ('Argumentene uten søkeord er', args)
skriv ut ('Søkeordargumentene er', kwargs)
funksjon (* args)
returemballasje
@ dec_var_args
def fun_non_key_args (* args):
for jeg argumenterer:
skrive ut (i)
@ dec_var_args
def fun_key_args ():
skriv ut ("Søkeordargumenter")
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
eksempel8.py:
Produksjon:
>> pythoneksempel8.py
Ex2: Anta at vi har 2 funksjoner
Funksjon1: Beregn summen av tall fra den gitte listen
Funksjon2: Multipliser hvert tall med 2 og legg dem til den angitte listen over tall
Hvis vi ønsker å beregne tiden det tar hver for utførelse, kan vi gjøre det på to måter
- Plasser koden mellom start- og sluttid i hver funksjon
- Skriv dekoratør for å beregne tid
Se nedenfor kode løst ved hjelp av dekoratør:
#decorator startexe_time_calc (func):
def innpakning (arg):
starttid = datetid.dato tid.nå()
func (arg)
sluttid = datetid.dato tid.nå()
print ("Det tar tid å utføre funksjonen" + func.__name__ + "er" + str (sluttid - sluttid))
returemballasje
#decorator end
@exe_time_calc
def cal_avg (data):
sum = 0
for jeg i data:
sum + = i
print ("Gjennomsnittet av gitt liste med tall er", sum // len (data))
@exe_time_calc
def mul_by_2 (data):
sum = 0
for jeg i data:
sum + = + (i * 2)
print ("Summen av alle tall etter multipliser med 2 er", sum)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
eksempel9.py:
Produksjon:
>> pythoneksempel9.py
Ovenstående dekoratør kan brukes til å beregne utførelsestid for alle funksjonene. Ved å bruke en dekoratør kan vi unngå gjentatt kode når vi har et krav for å beregne utførelsestiden for å plassere dekoratøren over funksjonsdefinisjonen.
Konklusjon:
Dekoratører endrer funksjonaliteten til en funksjon / metode uten å endre den opprinnelige koden til funksjonen som blir dekorert. Ved å bruke dette kan vi unngå å skrive gjentatt kode. Å kjenne dekoratørkonseptet vil gjøre oss sterke i python. Vi kan bruke dekoratør i følgende tilfeller:
- Autorisasjon i Python-rammer Eks: Flask og Django
- Hogst
- Mål utførelsestid