Definīcija: Dekorators ir Python dizaina modelis. Tā ir funkcija, kas kā argumentu ņem citu funkciju, pievieno tai kādu funkcionalitāti, to nemodificējot, un atgriež citu funkciju.
To sauc par “(@)” un ievieto pirms funkcijas, kuru mēs vēlamies izrotāt, definēšanas.
sintakse:
@dekoratora vārds
Funkcijas definīcija
Lai saprastu dekoratorus, mums jāzina tālāk minētie jēdzieni.
Funkcijas ir pirmās klases objekti. Tas nozīmē, ka funkciju var nodot kā argumentu, to var atgriezt no citas funkcijas, to var piešķirt mainīgajam, var definēt citā funkcijā. Lai labāk izprastu, skatiet zemāk redzamos piemērus.
- Funkciju var nodot kā argumentu
Piem .: def pieaugums (n):
atgriešanās n + 1
def demo_funcall (funkcija):
skaitlis = 5
atgriešanās funkcija (num)
demo_funcall (pieaugums)Šeit pieauguma funkcija nodota kā arguments
piemērs1.py:
Izeja:
>> pitona piemērs.py
- Funkciju var atgriezt no citas funkcijas
Piem .: def vēlas ():
def say_wish ():
atgriešanās "Daudz laimes dzimšanas dienā"
atgriezties say_wish
sveiki = vēlme ()
Sveiki()2. piemērs.py:
Izeja:
>> pitona piemērs2.py
Funkcija say_wish atgriezās no vēlmju funkcijas - Funkciju var mainīt un piešķirt mainīgajam
Piem .: def pievienot (a, b):
atgriezt a + b
sum2nos = pievienot # Šeit funkcija pievienot, kas piešķirta mainīgajam
sum2nos (5,11)3. piemērs.py:
Izeja:
>> pitona piemērs3.py
- Definējiet funkciju citas funkcijas iekšpusē
Piem .: def pievienot (a, b):
def summa2 (a, b):
atgriezt a + b
res = summa2 (a, b)
atgriešanās rez
pievienot (10,15)4. piemērs.py:
Izeja:
>> pitona piemērs.py
Slēgšana:
Python ļauj ligzdotajai funkcijai piekļūt norobežojošās funkcijas ārējai darbības jomai.
def sveiciens (ziņojums):"Enclosong funkcija"
def send_greeting ():
"Ligzdota funkcija"
izdrukāt (ziņojumu)
send_greeting ()
sveiciens ("Labrīt")
5. piemērs.py:
Izeja:
>> pitona piemērs.py
Pēc tam, kad tagad esat sapratis iepriekš minētos jēdzienus, mēs uzrakstīsim dekoratora piemēru.
Ex1: Šeit mēs izrotāsim ziņojuma funkciju. Ziņojuma drukāšana iekšpusē ****, nemainot sākotnējo funkciju, t.e., ziņojuma funkcija.
#dekoratora sākumsdef print_msg (funkcija):
def iesaiņotājs ():
funkcija ()
atgriešanās iesaiņojums
#dekoratora beigas
def ziņojums ():
drukāt (“Šis ir pirmais dekoratora demonstrēšanas piemērs”)
labdien = print_msg (ziņa)
Sveiki()
6. piemērs.py:
Izeja:
>> pitona piemērs.py
Vienkāršākajā formā mēs varam novietot dekoratoru virs funkcijas definīcijas un izsaukt funkciju, kā parādīts zemāk:
Izmantojiet šo dekoratoru neatkarīgi no tā, kādu stīgu mēs vēlamies izrotāt iekšpusē ***.
Izeja:
Vairāki dekoratori:
Mums var būt vairāki dekoratori vienai funkcijai. Šeit dekorators tiek uzklāts tādā secībā, kādā mēs to saucām.
sintakse:
@ dekorators2
@ dekorators1
Funkcijas definīcija
Šeit tiks izmantots 1. dekorators, pēc tam 2. dekorators.
Argumentu nodošana dekoratora funkcijām:
Mēs varam nodot argumentus iesaiņošanas funkcijai. Argumenti, kas nodoti funkcijai, kuru mēs vēlamies izrotāt.
Piem .:
def deco_wish (funkcija):def iesaiņotājs (arg1, arg2):
drukāt ('nodotie argumenti ir', arg1, arg2)
drukāt ('**********************')
funkcija (arg1, arg2)
drukāt ('**********************')
atgriešanās iesaiņojums
@deco_wish
def vēlme (a1, a2):
drukāt (a1, a2)
vēlējums (“Labs”, “Rīts”)
vēlējums ('Labi', 'Pēcpusdiena')
7. piemērs.py:
Izeja:
>> pitona piemērs.py
Dodiet mainīgā argumentu skaitu dekoratora funkcijai:
Mēs varam nodot jebkuru argumentu skaitu, izmantojot * args (argumenti, kas nav atslēgvārdi, piemēram, skaitļi) un ** kwargs (atslēgvārdu argumenti, piemēram, vārdnīca). Abi ir pozicionālie argumenti, un argumentus saglabā args un kwargs mainīgajos.
Piezīme: Šeit mēs varam izmantot jebkuru vārdu args un kwargs vietā, taču šos nosaukumus ieteicams izmantot.
Piem .:
def dec_var_args (funtion):def iesaiņotājs (* args, ** kwargs):
drukāt (“Argumenti, kas nav atslēgvārdi, ir”, argumenti)
print ('Atslēgvārda argumenti ir', kwargs)
funkcija (* args)
atgriešanās iesaiņojums
@ dec_var_args
def fun_non_key_args (* args):
jo es argos:
drukāt (i)
@ dec_var_args
def fun_key_args ():
drukāt (“Atslēgvārdu argumenti”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
8. piemērs.py:
Izeja:
>> pitona piemērs.py
Ex2: Pieņemsim, ka mums ir 2 funkcijas
Funkcija1: aprēķiniet skaitļu summu no norādītā saraksta
Funkcija2: reiziniet katru skaitli ar 2 un pievienojiet tos norādītajam skaitļu sarakstam
Ja mēs vēlamies aprēķināt katra izpildei nepieciešamo laiku, to var izdarīt divos veidos
- Katrā funkcijā ievietojiet kodu starp sākuma un beigu laiku
- Rakstiet dekoratoru laika aprēķināšanai
Skatīt kodu, kas atrisināts, izmantojot dekoratoru:
#dekoratora sākumsexe_time_calc (func):
def iesaiņotājs (arg):
sākuma_ laiks = datuma laiks.datums Laiks.tagad ()
func (arg)
end_time = datuma laiks.datums Laiks.tagad ()
print ("Funkcijas izpildes laiks" + func.__name__ + "ir" + str (end_time - end_time))
atgriešanās iesaiņojums
#dekoratora beigas
@exe_time_calc
def cal_avg (dati):
summa = 0
i datiem:
summa + = i
drukāt ("Dotā skaitļu vidējais rādītājs ir", summa // len (dati))
@exe_time_calc
def mul_by_2 (dati):
summa = 0
i datiem:
summa + = + (i * 2)
drukāt ("Visu skaitļu summa pēc reizināšanas ar 2 ir", summa)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
9. piemērs.py:
Izeja:
>> pitona piemērs.py
Iepriekš minēto dekoratoru var izmantot, lai aprēķinātu izpildes laiku jebkurai no funkcijām. Izmantojot dekoratoru, mēs varam izvairīties no atkārtota koda, kad mums ir prasība aprēķināt izpildes laiku, lai dekoratoru novietotu virs funkcijas definīcijas.
Secinājums:
Dekoratori maina funkcijas / metodes funkcionalitāti, nemainot dekorējamās funkcijas sākotnējo kodu. Izmantojot to, mēs varam izvairīties no atkārtota koda rakstīšanas. Zinot dekoratora koncepciju, mēs kļūsim spēcīgi pitonā. Dekoratoru mēs varam izmantot šādos gadījumos:
- Autorizācija Python sistēmā: Ex: Flask and Django
- Mežizstrāde
- Izmēri izpildes laiku