Python

Python Dekoraterji

Python Dekoraterji
V tem članku bomo razpravljali o Python Decorators.

Opredelitev: Dekorater je oblikovalski vzorec v Pythonu. To je funkcija, ki sprejme drugo funkcijo kot argument, ji doda nekaj funkcij, ne da bi jo spremenila, in vrne drugo funkcijo.

Temu pravimo z uporabo »(@)« in ga postavimo pred definiranje funkcije, ki jo želimo okrasiti.

sintaksa:

@dekorator ime
Opredelitev funkcije

Za razumevanje dekoraterjev moramo poznati spodnje koncepte.
Funkcije so prvovrstni objekti. To pomeni, da je funkcijo mogoče predati kot argument, jo lahko vrne druga funkcija, jo je mogoče dodeliti spremenljivki, jo je mogoče določiti v drugi funkciji. Za boljše razumevanje si oglejte spodnje primere.

  1. Funkcijo lahko prenesete kot argument
    Primer:

    prirast def (n):
    vrnitev n + 1
    def demo_funcall (funkcija):
    število = 5
    funkcija vrnitve (num)
    demo_funcall (prirastek)

    Tu je funkcija povečanja posredovana kot argument

    primer1.py:

    Izhod:

    >> primer python1.py

  2. Funkcijo lahko vrnete iz druge funkcije
    Primer:

    def želja ():
    def say_wish ():
    vrnitev "Happy Birthday"
    vrni say_wish
    zdravo = želja ()
    zdravo()

    primer2.py:

    Izhod:

    >> primer python2.py

    Tu je funkcija say_wish vrnjena iz funkcije želja

  3. Funkcijo lahko spremenite in dodelite spremenljivki
    Primer:

    def dodaj (a, b):
    vrnite a + b
    sum2nos = add # Tu je funkcija dodana spremenljivki
    sum2nos (5,11)

    primer3.py:

    Izhod:
    >> primer python3.py

  4. Določite funkcijo znotraj druge funkcije
    Primer:

    def dodaj (a, b):
    def sum2 (a, b):
    vrnite a + b
    res = vsota2 (a, b)
    vrni res
    dodaj (10,15)

    primer4.py:

    Izhod:
    >> primer python4.py

Zaključek:

Python omogoča ugnezdeni funkciji dostop do zunanjega obsega ograjevalne funkcije.

def pozdrav (sporočilo):
"Funkcija Enclosong"
def send_greeting ():
"Vgnezdena funkcija"
natisni (sporočilo)
Pošlji pozdrav()
pozdrav ("Dobro jutro")

primer5.py:

Izhod:

>> primer python5.py

Po razumevanju zgornjih konceptov bomo napisali primer dekoraterja.

Primer1: Tu bomo okrasili funkcijo sporočila. Tiskanje sporočila znotraj **** brez spreminjanja prvotne funkcije, tj.e., funkcija sporočila.

#decorator start
def print_msg (funkcija):
def ovojnica ():
funkcija ()
povratni ovoj
#decorator end
sporočilo def ():
print ("To je prvi primer za prikaz dekoraterja")
zdravo = print_msg (sporočilo)
zdravo()

primer6.py:

Izhod:

>> primer pythona6.py

V najpreprostejši obliki lahko postavimo dekorater na definicijo funkcije in pokličemo funkcijo, kot je prikazano spodaj:

Tu ne glede na niz, ki ga želimo okrasiti znotraj ***, uporabite ta okrasitelj.

Izhod:

Več dekoraterjev:

Za eno funkcijo imamo lahko več dekoraterjev. Tu se dekorater uporablja v vrstnem redu, ki smo ga poklicali.
sintaksa:
@ dekorater2
@ dekorater1
Opredelitev funkcije

Tu bo uporabljen 1. dekorater, nato 2. dekorater.

Posredovanje argumentov funkcijam dekoraterja:

Argumente lahko posredujemo funkciji zavijanja. Argumenti, posredovani funkciji, za katero želimo okrasiti.

Primer:

def deco_wish (funkcija):
def ovojnica (arg1, arg2):
print ('Posredovani argumenti so', arg1, arg2)
natisni ('*********************')
funkcija (arg1, arg2)
natisni ('*********************')
povratni ovoj
@deco_wish
def želja (a1, a2):
tiskanje (a1, a2)
želja ('Dobro', 'Jutro')
želja ('Dobro', 'Popoldan')

primer7.py:

Izhod:

>> primer python7.py

Posredovanje spremenljivega števila argumentov funkciji dekoraterja:

Argumente lahko posredujemo poljubno število z uporabo * args (argumenti brez ključnih besed, kot so številke) in ** kwargs (argumenti ključnih besed, kot je slovar). Oba sta pozicijska argumenta in argumente shranjujeta v spremenljivki args in kwargs.

Opomba: Tu lahko namesto args in kwargs uporabimo katero koli ime, vendar je priporočljivo, da se ta imena uporabljajo.

Primer:

def dec_var_args (funtion):
def ovojnica (* args, ** kwargs):
print ('Argumenti brez ključnih besed so', args)
print ('Argumenti ključne besede so', kwargs)
funkcija (* args)
povratni ovoj
@ dec_var_args
def fun_non_key_args (* args):
kajti jaz v argumentih:
natisni (i)
@ dec_var_args
def fun_key_args ():
print (“Argumenti ključnih besed”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

primer8.py:

Izhod:

>> primer python8.py

Primer2: Recimo, da imamo dve funkciji
Funkcija1: Izračunajte vsoto števil s danega seznama
Funkcija2: Vsako število pomnožite z 2 in ju dodajte na dani seznam števil
Če želimo izračunati čas, ki ga vsak porabi za izvedbo, lahko to storimo na dva načina

  1. Kodo vstavite med začetni in končni čas vsake funkcije
  2. Napišite dekorater za izračun časa

Glejte spodnjo kodo, razrešeno z dekoraterjem

#decorator start
exe_time_calc (func):
def ovojnica (arg):
start_time = datetime.Datum čas.zdaj ()
func (arg)
end_time = datetime.Datum čas.zdaj ()
print ("Čas, potreben za izvajanje funkcije" + funkc.__name__ + "je" + str (čas_konca - čas_konca))
povratni ovoj
#decorator end
@exe_time_calc
def cal_avg (podatki):
vsota = 0
za i v podatkih:
vsota + = i
print ("Povprečje danega seznama številk je", vsota // len (podatki))
@exe_time_calc
def mul_by_2 (podatki):
vsota = 0
za i v podatkih:
vsota + = + (i * 2)
print ("Vsota vseh števil po pomnožitvi z 2 je", vsota)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

primer9.py:

Izhod:

>> primer python9.py

Zgornji dekorater lahko uporabimo za izračun časa izvajanja katere koli funkcije. Z uporabo dekoratorja se lahko izognemo ponavljajoči se kodi, kadar imamo zahtevo za izračun časa izvedbe, da dekorator postavimo nad definicijo funkcije.

Zaključek:

Dekoraterji spremenijo funkcionalnost funkcije / metode, ne da bi spremenili prvotno kodo funkcije, ki se okrasi. S tem se lahko izognemo pisanju ponavljajoče se kode. Poznavanje koncepta dekoraterja nas bo okrepilo v pythonu. Dekorater lahko uporabimo v spodnjih primerih:

Top 5 kartic za zajemanje iger
Vsi smo v YouTubu videli in oboževali pretakanje iger. PewDiePie, Jakesepticye in Markiplier so le nekateri izmed najboljših igralcev, ki so zaslužili...
Kako razviti igro na Linuxu
Pred desetletjem le malo uporabnikov Linuxa napoveduje, da bo njihov najljubši operacijski sistem nekoč priljubljena igralna platforma za komercialne ...
Odprtokodna vrata komercialnih igralnih sistemov
Brezplačne, odprtokodne in medplatformacijske igre, ki jih lahko uporabite za igranje starih, pa tudi nekaterih dokaj nedavnih naslovov iger. V tem čl...