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.
- 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
- 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 - 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
- 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 startdef 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
- Kodo vstavite med začetni in končni čas vsake funkcije
- Napišite dekorater za izračun časa
Glejte spodnjo kodo, razrešeno z dekoraterjem
#decorator startexe_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:
- Pooblastilo v ogrodjih Python Ex: Flask in Django
- Sečnja
- Izmerite čas izvedbe