Python

Python-dekoratører

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

Definition: Decorator er et designmønster i Python. Det er en funktion, der tager en anden funktion som et argument, tilføjer nogle funktioner til den uden at ændre den og returnerer en anden funktion.

Dette kaldes ved hjælp af “(@)” og placeres, inden der defineres en funktion, som vi vil dekorere.

syntaks:

@decorator navn
Funktionsdefinition

For at forstå dekoratører skal vi kende nedenstående begreber.
Funktioner er førsteklasses objekter. Det betyder, at en funktion kan overføres som et argument, kan returneres fra en anden funktion, kan tildeles en variabel, kan defineres i en anden funktion. Se nedenstående eksempler for en bedre forståelse.

  1. En funktion kan overføres som et argument
    Eks:

    def stigning (n):
    returnere n + 1
    def demo_funcall (funktion):
    num = 5
    returfunktion (num)
    demo_funcall (inkrement)

    Her bestod inkrementfunktionen som et argument

    eksempel1.py:

    Produktion:

    >> Python-eksempel1.py

  2. Funktion kan returneres fra en anden funktion
    Eks:

    def ønsker ():
    def say_wish ():
    returner "Tillykke med fødselsdagen"
    returner say_wish
    hej = ønske ()
    Hej()

    eksempel2.py:

    Produktion:

    >> python-eksempel2.py

    Her say_wish funktion returneret fra ønskefunktionen

  3. Funktionen kan ændres og tildeles en variabel
    Eks:

    def tilføj (a, b):
    returner a + b
    sum2nos = tilføj # Her tilføjes funktion tilføjet til variablen
    sum2nos (5,11)

    eksempel3.py:

    Produktion:
    >> python-eksempel3.py

  4. Definer funktion inde i en anden funktion
    Eks:

    def tilføj (a, b):
    def sum2 (a, b):
    returner a + b
    res = sum2 (a, b)
    returnere res
    tilføj (10,15)

    eksempel4.py:

    Produktion:
    >> python-eksempel4.py

Lukning:

Python giver en indlejret funktion adgang til det ydre omfang af den indesluttende funktion.

def hilsen (besked):
"Enclosong-funktion"
def send_hilsen ():
"Indlejret funktion"
udskrive (besked)
Send Hilsen()
hilsen ("God morgen")

eksempel5.py:

Produktion:

>> Python-eksempel5.py

Efter at have forstået ovenstående begreber nu, vil vi skrive et dekoratøreksempel.

Eks1: Her vil vi dekorere beskedfunktionen. Udskrivning af msg inde i **** uden at ændre den oprindelige funktion, i.e., beskedfunktion.

#decorator start
def print_msg (funktion):
def indpakning ():
fungere()
returemballage
#decorator ende
def besked ():
print ("Dette er første eksempel til demonstration af dekoratør")
hej = print_msg (besked)
Hej()

eksempel 6.py:

Produktion:

>> Python-eksempel6.py

I den enkleste form kan vi placere dekoratør oven på funktionsdefinitionen og kalde funktionen som vist nedenfor:

Her uanset streng, vi vil dekorere inde i ***, skal du bruge denne dekoratør.

Produktion:

Flere dekoratører:

Vi kan have flere dekoratører til en enkelt funktion. Her anvendes dekoratøren i den rækkefølge, vi ringede til.
syntaks:
@ dekoratør2
@ dekoratør1
Funktionsdefinition

Her anvendes 1. dekoratør, derefter 2. dekoratør.

Videregivelse af argumenter til dekoratørfunktioner:

Vi kan overføre argumenter til indpakningsfunktionen. Argumenterne overføres til den funktion, som vi vil dekorere for.

Eks:

def deco_wish (funktion):
def indpakning (arg1, arg2):
print ('De godkendte argumenter er', arg1, arg2)
Print ('*********************')
funktion (arg1, arg2)
Print ('*********************')
returemballage
@deco_wish
def ønske (a1, a2):
print (a1, a2)
ønsker ('Godt', 'Morgen')
ønsker ('Godt', 'Eftermiddag')

eksempel7.py:

Produktion:

>> python-eksempel7.py

Send variabelt antal argumenter til dekoratørfunktionen:

Vi kan videregive et hvilket som helst antal argumenter ved hjælp af * args (ikke-søgeordsargumenter som tal) og ** kwargs (søgeordsargumenter som en ordbog). Begge er positionelle argumenter og gemmer argumenterne i args- og kwargs-variabler.

Bemærk: Her kan vi bruge ethvert navn i stedet for args og kwargs, men disse navne anbefales at bruge.

Eks:

def dec_var_args (funtion):
def indpakning (* args, ** kwargs):
print ('Argumenterne uden søgeord er', args)
print ('Søgeordsargumenterne er', kwargs)
funktion (* args)
returemballage
@ dec_var_args
def fun_non_key_args (* args):
for jeg argumenterer:
udskrive (i)
@ dec_var_args
def fun_key_args ():
print ("Søgeordsargumenter")
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

eksempel 8.py:

Produktion:

>> python-eksempel8.py

Ex2: Antag, at vi har 2 funktioner
Funktion1: Beregn summen af ​​tal fra den givne liste
Funktion2: Multiplicer hvert nummer med 2 og tilføj dem til den givne nummerliste
Hvis vi ønsker at beregne den tid, det tager af hver til udførelse, kan gøre det på to måder

  1. Placer koden mellem start- og sluttidspunktet i hver funktion
  2. Skriv dekoratør til beregning af tid

Se nedenstående kode løst ved hjælp af dekoratør:

#decorator start
exe_time_calc (func):
def indpakning (arg):
starttid = datetid.dato tid.nu()
func (arg)
sluttid = datetid.dato tid.nu()
print ("Det tager tid at udføre funktionen" + funk.__name__ + "er" + str (sluttid - sluttid))
returemballage
#decorator ende
@exe_time_calc
def cal_avg (data):
sum = 0
for jeg i data:
sum + = i
print ("Gennemsnittet af den givne nummerliste er", sum // len (data))
@exe_time_calc
def mul_by_2 (data):
sum = 0
for jeg i data:
sum + = + (i * 2)
print ("Summen af ​​alle tal efter gang med 2 er", sum)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

eksempel 9.py:

Produktion:

>> python-eksempel 9.py

Ovenstående dekoratør kan bruges til at beregne udførelsestid for enhver af funktionerne. Ved at bruge en dekoratør kan vi undgå gentagen kode, når vi har et krav til beregning af udførelsestiden for at placere dekoratøren over funktionsdefinitionen.

Konklusion:

Dekoratorer ændrer funktionaliteten af ​​en funktion / metode uden at ændre den oprindelige kode for den funktion, der bliver dekoreret. Ved hjælp af dette kan vi undgå at skrive gentagen kode. At kende dekoratørkonceptet vil gøre os stærke inden for python. Vi kan bruge dekoratør i nedenstående tilfælde:

Shadow of the Tomb Raider til Linux-vejledning
Shadow of the Tomb Raider er den tolvte tilføjelse til Tomb Raider-serien - en action-adventure-spilfranchise oprettet af Eidos Montreal. Spillet blev...
Sådan styrkes FPS i Linux?
FPS står for Billeder i sekundet. FPS's opgave er at måle billedhastigheden i videoafspilninger eller spiloptræden. I enkle ord betegnes antallet af u...
Top Oculus App Lab-spil
Hvis du er Oculus-headset-ejer, skal du være opmærksom på sideloading. Sideladning er processen med at installere ikke-butiksindhold på dit headset. S...