Python

Python-dekoratører

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

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.

  1. 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

  2. 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

  3. 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

  4. 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 start
def 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

  1. Plasser koden mellom start- og sluttid i hver funksjon
  2. Skriv dekoratør for å beregne tid

Se nedenfor kode løst ved hjelp av dekoratør:

#decorator start
exe_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:

Hvordan bruke AutoKey til å automatisere Linux-spill
AutoKey er et desktopautomatiseringsverktøy for Linux og X11, programmert i Python 3, GTK og Qt. Ved å bruke skript og MACRO-funksjonalitet kan du aut...
Hvordan vise FPS-teller i Linux-spill
Linux-spill fikk et stort press da Valve kunngjorde Linux-støtte for Steam-klient og spillene deres i 2012. Siden den gang har mange AAA- og indiespil...
Hvordan laste ned og spille Sid Meier's Civilization VI på Linux
Introduksjon til spillet Civilization 6 er et moderne syn på det klassiske konseptet som ble introdusert i serien av Age of Empires-spillene. Ideen va...