Python

Python-decorateurs

Python-decorateurs
In dit artikel gaan we het hebben over Python-decorateurs.

Definitie: Decorator is een ontwerppatroon in Python. Het is een functie die een andere functie als argument neemt, er functionaliteit aan toevoegt zonder deze te wijzigen, en een andere functie retourneert.

Dit wordt aangeroepen met "(@)" en geplaatst voordat een functie wordt gedefinieerd die we willen decoreren.

syntaxis:

@decorateur naam
Functiedefinitie

Om decorateurs te begrijpen, moeten we de onderstaande concepten kennen:.
Functies zijn eersteklas objecten. Het betekent dat een functie kan worden doorgegeven als argument, kan worden geretourneerd door een andere functie, kan worden toegewezen aan een variabele, kan worden gedefinieerd in een andere functie. Zie de onderstaande voorbeelden voor een beter begrip:.

  1. Een functie kan als argument worden doorgegeven
    Ex:

    def increment(n):
    retour n + 1
    def demo_funcall (functie):
    aantal = 5
    retourfunctie (num)
    demo_funcall (toename)

    Hier increment-functie doorgegeven als argument

    voorbeeld 1.py:

    Uitgang:

    >> python voorbeeld1.py

  2. Functie kan worden geretourneerd vanuit een andere functie
    Ex:

    def wens():
    def say_wish():
    terug "Gefeliciteerd"
    return say_wish
    hallo = wens()
    Hallo()

    voorbeeld2.py:

    Uitgang:

    >>python-voorbeeld2.py

    Hier is de functie say_wish geretourneerd vanuit de wish-functie

  3. Functie kan worden gewijzigd en toegewezen aan een variabele
    Ex:

    def toevoegen(a,b):
    retourneer een +b
    sum2nos = add # Here functie toevoegen toegewezen aan variabele
    som2nos(5,11)

    voorbeeld3.py:

    Uitgang:
    >> python-voorbeeld3.py

  4. Definieer functie binnen een andere functie
    Ex:

    def toevoegen(a,b):
    def som2(a,b):
    retourneer a + b
    res = som2(a,b)
    retour res
    toevoegen(10,15)

    voorbeeld4.py:

    Uitgang:
    >> python-voorbeeld4.py

Sluiting:

Python staat een geneste functie toe om toegang te krijgen tot het buitenste bereik van de omsluitende functie.

def begroeting (bericht):
"Enclosong-functie"
def send_greeting():
"geneste functie"
afdrukken (bericht)
send_greeting()
groet ("Goedemorgen")

voorbeeld5.py:

Uitgang:

>> python-voorbeeld5.py

Nadat we de bovenstaande concepten nu hebben begrepen, zullen we een voorbeeld van een decorateur schrijven.

Ex1: hier zullen we de berichtfunctie versieren. Het bericht binnen **** afdrukken zonder de oorspronkelijke functie te wijzigen, i.e., bericht functie:.

#decorateur start
def print_msg(functie):
def wrapper():
functie()
retourverpakking
#decorateur einde
def bericht():
print ("Dit is het eerste voorbeeld voor het demonstreren van decorateur")
hallo = print_msg (bericht)
Hallo()

voorbeeld6.py:

Uitgang:

>> voorbeeld python6.py

In de eenvoudigste vorm kunnen we decorateur bovenop de functiedefinitie plaatsen en de functie aanroepen zoals hieronder weergegeven:

Hier, welke string we ook van binnen willen versieren ***, gebruik deze decorateur.

Uitgang:

Meerdere decorateur:

We kunnen meerdere decorateurs hebben voor een enkele functie. Hier wordt de decorateur toegepast in de volgorde die we hebben genoemd.
syntaxis:
@decorateur2
@decorateur1
Functiedefinitie

Hier wordt 1e decorateur toegepast, daarna 2e decorateur.

Argumenten doorgeven aan decorateurfuncties:

We kunnen argumenten doorgeven aan de wrapper-functie. De argumenten die zijn doorgegeven aan de functie waarvoor we willen decoreren.

Ex:

def deco_wish(functie):
def wrapper (arg1, arg2):
print ('De doorgegeven argumenten zijn ',arg1, arg2)
afdrukken ('********************')
functie (arg1, arg2)
afdrukken ('********************')
retourverpakking
@deco_wish
def wens(a1, a2):
afdrukken(a1,a2)
wens ('Goed', 'Morgen')
wens ('Goed', 'Middag')

voorbeeld7.py:

Uitgang:

>> voorbeeld python7.py

Geef een variabel aantal argumenten door aan de decorateurfunctie:

We kunnen een willekeurig aantal argumenten doorgeven met *args (niet-trefwoordargumenten zoals getallen) en **kwargs (trefwoordargumenten zoals een woordenboek). Beide zijn positionele argumenten en slaan de argumenten op in args en kwargs variabelen.

Opmerking: hier kunnen we elke naam gebruiken in plaats van args en kwargs, maar deze namen worden aanbevolen om te gebruiken.

Ex:

def dec_var_args(functie):
def wrapper(*args, **kwargs):
print('De niet-sleutelwoordargumenten zijn', args)
print('De trefwoordargumenten zijn', kwargs)
functie(*args)
retourverpakking
@ dec_var_args
def fun_non_key_args(*args):
voor ik in argumenten:
afdrukken (ik)
@ dec_var_args
def fun_key_args():
print ("Trefwoordargumenten")
fun_non_key_args((4,5,6))
fun_key_args(fname='Anand', lname='Wiskunde')

voorbeeld8.py:

Uitgang:

>> voorbeeld python8.py

Ex2: stel dat we 2 functies hebben:
Functie1: Bereken de som van getallen uit de gegeven lijst
Functie2: Vermenigvuldig elk getal met 2 en voeg ze toe aan de gegeven lijst met getallen
Als we de tijd willen berekenen die elk nodig heeft voor de uitvoering, kunnen we dit op 2 manieren doen

  1. Plaats code tussen de begin- en eindtijd in elke functie
  2. Schrijf decorateur voor het berekenen van tijd

Zie onderstaande code opgelost met behulp van decorateur:

#decorateur start
exe_time_calc(func):
def wrapper (arg):
start_time = datetime.datum Tijd.nu()
func(arg)
end_time = datetime.datum Tijd.nu()
print ("De tijd die nodig is voor het uitvoeren van functie " + func.__name__ + " is " + str(end_time - end_time))
retourverpakking
#decorateur einde
@exe_time_calc
def cal_avg(gegevens):
som = 0
voor i in gegevens:
som += i
print ("Het gemiddelde van de gegeven lijst met getallen is ", sum//len(data))
@exe_time_calc
def mul_by_2(gegevens):
som = 0
voor i in gegevens:
som += + (i*2)
print ("De som van alle getallen na vermenigvuldiging met 2 is", som)
cal_avg ([10,20,30,40,50])
mul_by_2([10,20,30,40,50])

voorbeeld9.py:

Uitgang:

>> voorbeeld python9.py

De bovenstaande decorateur kan worden gebruikt voor het berekenen van de uitvoeringstijd voor elk van de functies. Door een decorateur te gebruiken, kunnen we herhaalde code vermijden wanneer we een vereiste hebben voor het berekenen van de uitvoeringstijd om de decorateur boven de functiedefinitie te plaatsen.

Conclusie:

Decorateurs veranderen de functionaliteit van een functie/methode zonder de originele code te wijzigen van de functie die wordt gedecoreerd. Hiermee kunnen we voorkomen dat we herhaalde code schrijven. Het kennen van het decorateurconcept zal ons sterk maken in python. We kunnen decorateur gebruiken in de onderstaande gevallen:

Beheer en beheer muisbewegingen tussen meerdere monitoren in Windows 10
Muisbeheer voor twee schermen laat je muisbewegingen tussen meerdere monitoren controleren en configureren door de bewegingen nabij de grens te vertra...
Met WinMouse kunt u de beweging van de muisaanwijzer op Windows-pc aanpassen en verbeteren
Als u de standaardfuncties van uw muisaanwijzer wilt verbeteren, gebruik dan freeware WinMuis. Het voegt meer functies toe om u te helpen het meeste u...
Linkermuisknop werkt niet op Windows 10
Als u een speciale muis gebruikt met uw laptop of desktopcomputer, maar de linkermuisknop werkt niet not op Windows 10/8/7 om wat voor reden dan ook, ...