Definitsioon: Decorator on Pythoni kujundusmuster. See on funktsioon, mis võtab argumendina mõne muu funktsiooni, lisab sellele funktsionaalsust seda muutmata ja tagastab teise funktsiooni.
Seda nimetatakse "(@)" abil ja see asetatakse enne funktsiooni määratlemist, mida soovime kaunistada.
süntaks:
@decoratori nimi
Funktsiooni määratlus
Kaunistajate mõistmiseks peame teadma järgmisi mõisteid.
Funktsioonid on esmaklassilised objektid. See tähendab, et funktsiooni saab edastada argumendina, selle saab tagastada teisest funktsioonist, saab määrata muutujale, saab määratleda teises funktsioonis. Parema mõistmise huvides vaadake allpool toodud näiteid.
- Funktsiooni saab edastada argumendina
Nt: def juurdekasv (n):
tagastage n + 1
def demo_funcall (funktsioon):
arv = 5
tagastamisfunktsioon (arv)
demo_funcall (juurdekasv)Siin edastatakse argumendina juurdekasvu funktsioon
näide1.py:
Väljund:
>> pythoni näide1.py
- Funktsiooni saab tagastada teisest funktsioonist
Nt: def soov ():
def say_wish ():
tagasi "Palju õnne sünnipäevaks"
tagasi ütle_soov
tere = soov ()
Tere()näide2.py:
Väljund:
>> pythoni näide2.py
Funktsioon say_wish naasis siin soovifunktsioonist - Funktsiooni saab muuta ja määrata muutujale
Nt: def lisama (a, b):
tagastage a + b
sum2nos = add # Muutujale määratud funktsioon add
sum2nos (5,11)näide3.py:
Väljund:
>> pythoni näide3.py
- Määrake funktsioon teise funktsiooni sees
Nt: def lisama (a, b):
def summa2 (a, b):
tagastage a + b
res = summa2 (a, b)
tagastama res
lisa (10,15)näide4.py:
Väljund:
>> pythoni näide4.py
Sulgemine:
Python võimaldab pesastatud funktsioonil pääseda juurde piirava funktsiooni välisele ulatusele.
def tervitus (sõnum):"Enclosong funktsioon"
def send_greeting ():
"Pesastatud funktsioon"
print (sõnum)
saatke_tervitus ()
tervitus ("Tere hommikust")
näide5.py:
Väljund:
>> pythoni näide5.py
Pärast ülaltoodud mõistete mõistmist kirjutame dekoraatori näite.
Ex1: Siin me kaunistame sõnumi funktsiooni. Sõnumi printimine **** sisse ilma algset funktsiooni muutmata, st.e., sõnumi funktsioon.
#dekoraatori algusdef print_msg (funktsioon):
def ümbris ():
funktsioon ()
tagastuspakend
#dekoraatori lõpp
def sõnum ():
print ("See on esimene näide dekoraatori demonstreerimiseks")
tere = print_msg (sõnum)
Tere()
näide6.py:
Väljund:
>> pythoni näide6.py
Lihtsamas vormis saame funktsiooni määratluse peale asetada dekoraatori ja kutsuda funktsiooni, nagu allpool näidatud:
Siin kasutage seda dekoraatorit, olenemata stringist, mida me tahame sisemuses kaunistada ***.
Väljund:
Mitu sisekujundajat:
Meil võib ühe funktsiooni jaoks olla mitu dekoraatorit. Siin rakendatakse dekoraator meie kutsutud järjekorras.
süntaks:
@ dekoraator2
@ dekoraator1
Funktsiooni määratlus
Siin rakendatakse 1. dekoraatorit, seejärel 2. dekoraatorit.
Argumentide edastamine dekoraatori funktsioonidele:
Võime argumendid edastada ümbrisfunktsioonile. Argumendid edastati funktsioonile, mille jaoks me tahame kaunistada.
Nt:
def deco_wish (funktsioon):def ümbris (arg1, arg2):
print ('Edastatud argumendid on', arg1, arg2)
print ('**********************')
funktsioon (arg1, arg2)
print ('*********************')
tagastuspakend
@deco_wish
def soov (a1, a2):
print (a1, a2)
soov ('hea', 'hommik')
soov ('hea', 'pärastlõuna')
näide7.py:
Väljund:
>> pythoni näide7.py
Muutuva arvu argumentide edastamine sisustusfunktsioonile:
Saame edastada suvalise arvu argumente, kasutades * args (märksõnadeta argumendid nagu numbrid) ja ** kwargs (märksõna argumendid nagu sõnastik). Mõlemad on positsioonilised argumendid ja salvestavad argumendid argide ja kwargsi muutujatesse.
Märkus. Siin võime argide ja kwargide asemel kasutada mis tahes nime, kuid neid nimesid on soovitatav kasutada.
Nt:
def dec_var_args (funtion):def ümbris (* args, ** kwargs):
print ('Märksõnavälised argumendid on', args)
print ('Märksõna argumendid on', kwargs)
funktsioon (* args)
tagastuspakend
@ dec_var_args
def fun_non_key_args (* args):
minu jaoks argides:
trükk (i)
@ dec_var_args
def fun_key_args ():
print (“Märksõna argumendid”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
näide8.py:
Väljund:
>> pythoni näide8.py
Ex2: Oletame, et meil on 2 funktsiooni
Funktsioon1: arvutage antud loendi arvude summa
Funktsioon2: korrutage iga number kahega ja lisage need antud numbrite loendisse
Kui tahame arvutada, kui palju aega igaüks nende täitmiseks võtab, saame seda teha kahel viisil
- Asetage kood igas funktsioonis algus- ja lõppaja vahele
- Kirjutage dekoraator aja arvutamiseks
Vaadake allpool dekoraatori abil lahendatud koodi:
#dekoraatori algusexe_time_calc (func):
def ümbris (arg):
algusaeg = kuupäevaeg.kuupäev Kellaaeg.nüüd ()
funk (arg)
end_time = kuupäevaeg.kuupäev Kellaaeg.nüüd ()
print ("Funktsiooni käivitamiseks kuluv aeg" + func.__nimi__ + "on" + str (lõpp-aeg - lõpp-aeg))
tagastuspakend
#dekoraatori lõpp
@exe_time_calc
def cal_avg (andmed):
summa = 0
i jaoks andmetes:
summa + = i
print ("Antud numbriloendi keskmine on", summa // len (andmed))
@exe_time_calc
def mul_by_2 (andmed):
summa = 0
i jaoks andmetes:
summa + = + (i * 2)
print ("Kõigi arvude summa pärast 2-ga korrutamist on", summa)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
näide9.py:
Väljund:
>> pythoni näide9.py
Ülaltoodud dekoraatorit saab kasutada mis tahes funktsiooni täitmisaja arvutamiseks. Dekoraatori abil saame vältida korduvat koodi, kui meil on nõue täitmisaja arvutamiseks, et dekoraator asetada funktsiooni määratlusest kõrgemale.
Järeldus:
Sisekujundajad muudavad funktsiooni / meetodi funktsionaalsust muutmata funktsiooni originaalkoodi. Seda kasutades saame vältida korduva koodi kirjutamist. Kaunistaja kontseptsiooni tundmine muudab meid pythonis tugevaks. Dekoraatorit saame kasutada järgmistel juhtudel:
- Autoriseerimine Pythoni raamistikes Ex: Flask and Django
- Logimine
- Mõõtke täitmise aega