Python dekoratører

Python dekoratører
I denne artikkelen skal vi diskutere Python -dekoratører.

Definisjon: dekoratør er et designmønster i Python. Det er en funksjon som tar en annen funksjon som et argument, legger litt funksjonalitet til den uten å endre den, og returnerer en annen funksjon.

Dette kalles "(@)" og plasseres før vi definerer en funksjon som vi vil dekorere.

Syntaks:

@decorator navn
Funksjonsdefinisjon

For å forstå dekoratører, må vi kjenne konseptene 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 en bedre forståelse, se eksemplene nedenfor.

  1. En funksjon kan sendes som et argument
    Eks: DEF Increment (N):
    Return n + 1
    def demo_funcall (funksjon):
    Num = 5
    returfunksjon (num)
    demo_funcall (økning)

    Her har trinnfunksjonen bestått som et argument

    Eksempel1.PY:

    Produksjon:

    >> Python eksempel1.py

  2. Funksjon kan returneres fra en annen funksjon
    Eks: Def Wish ():
    def say_wish ():
    Returner "Gratulerer med dagen"
    Returner Say_wish
    Hei = ønske ()
    Hallo()

    Eksempel2.PY:

    Produksjon:

    >> Python Eksempel2.py

    Her sa Say_wish -funksjonen tilbake fra ønskefunksjonen

  3. Funksjon kan endres og tilordnes en variabel
    Eks: def add (a, b):
    Returner A +B
    sum2nos = legg til # her funksjon Legg til tildelt i variabel
    sum2nos (5,11)

    Eksempel3.PY:

    Produksjon:
    >> Python eksempel3.py

  4. Definer funksjon i en annen funksjon
    Eks: def add (a, b):
    def sum2 (a, b):
    Returner A + B
    res = sum2 (a, b)
    Return Res
    Legg til (10,15)

    Eksempel4.PY:

    Produksjon:
    >> Python Eksempel4.py

Lukking:

Python tillater en nestet funksjon for å få tilgang til det ytre omfanget av den omsluttende funksjonen.

def hilsen (melding):
"Enclosong -funksjon"
def send_greeting ():
"Nestet funksjon"
trykk (melding)
Send hilsen()
hilsen ("God morgen")

Eksempel5.PY:

Produksjon:

>> Python Eksempel5.py

Etter å ha forstått konseptene ovenfor nå, vil vi skrive et dekoratøreksempel.

EX1: Her vil vi dekorere meldingsfunksjonen. Skrive ut MSG inne i **** uten å endre den opprinnelige funksjonen, i.e., Meldingsfunksjon.

#Decorator Start
def print_msg (funksjon):
def wrapper ():
funksjon()
Retur innpakning
#Decorator End
def melding ():
trykk (“Dette er første eksempel for å demonstrere dekoratør”)
hei = print_msg (melding)
Hallo()

Eksempel6.PY:

Produksjon:

>> Python Eksempel6.py

I den enkleste formen kan vi plassere dekoratør på toppen av funksjonsdefinisjonen og kalle funksjonen som vist nedenfor:

Her uansett hvilken streng vi vil dekorere inni ***, bruk denne dekoratøren.

Produksjon:

Flere dekoratører:

Vi kan ha flere dekoratører for en enkelt funksjon. Her blir dekoratøren brukt i den rekkefølgen vi ringte.
Syntaks:
@dekorator2
@dekorator1
Funksjonsdefinisjon

Her blir 1. dekoratør påført, deretter 2. dekoratør.

Passerende argumenter til dekoratørfunksjoner:

Vi kan gi argumenter til innpakningsfunksjonen. Argumentene som ble gitt til funksjonen vi ønsker å dekorere.

Eks:

def deco_wish (funksjon):
Def Wrapper (Arg1, Arg2):
trykte ('De beståtte argumentene er', Arg1, Arg2)
skrive ut ('*********************')
Funksjon (Arg1, Arg2)
skrive ut ('*********************')
Retur innpakning
@Deco_wish
Def Wish (A1, A2):
Print (A1, A2)
ønsker ('bra', 'morgen')
ønsker ('bra', 'ettermiddag')

Eksempel7.PY:

Produksjon:

>> Python Eksempel7.py

Pass variabelt antall argumenter til dekoratørfunksjon:

Vi kan bestå et hvilket som helst antall argumenter som bruker *args (ikke-nøkkelord argumenter 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):
trykk ('De ikke -søkeordargumentene er', args)
trykk ('Nøkkelordargumentene er', Kwargs)
funksjon (*args)
Retur innpakning
@ des_var_args
def fun_non_key_args (*args):
for jeg i args:
trykk (i)
@ des_var_args
def fun_key_args ():
Print (“Søkeordsargumenter”)
FUN_NON_KEY_ARGS ((4,5,6))
FUN_KEY_ARGS (fname = 'anand', lname = 'matematikk')

Eksempel8.PY:

Produksjon:

>> Python Eksempel8.py

EX2: Anta at vi har 2 funksjoner
Funksjon1: Beregn summen av tall fra den gitte listen
Funksjon2: Multipliser hvert nummer med 2 og legg dem til den gitte listen over tall
Hvis vi ønsker å beregne tiden som er tatt av hver for utførelse, kan det gjøre det på to måter

  1. Plasser kode mellom start- og sluttiden i hver funksjon
  2. Skriv dekoratør for beregning av tid

Se kode som er løst ved hjelp av dekoratør:

#Decorator Start
exe_time_calc (func):
Def Wrapper (Arg):
start_time = DateTime.dato tid.nå()
func (arg)
End_Time = DateTime.dato tid.nå()
trykk ("Tiden tar for utførende funksjon" + func.__NAME__ + "er" + STR (END_TIME - END_TIME))
Retur innpakning
#Decorator End
@exe_time_calc
def cal_avg (data):
Sum = 0
For jeg i data:
sum += i
print ("Gjennomsnittet av gitt liste over tall er", sum // len (data))
@exe_time_calc
def mul_by_2 (data):
Sum = 0
For jeg i data:
sum + = + (i*2)
trykk ("Summen for 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:

>> Python Eksempel9.py

Ovennevnte dekoratør kan brukes til beregning av utførelsestid for noen av funksjonene. Ved å bruke en dekoratør, kan vi unngå gjentatt kode når vi har et krav til å 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 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 tilfellene nedenfor:

  • Autorisasjon i Python Frameworks Eks: Flask og Django
  • Hogst
  • Mål utførelsestid