Apibrėžimas: „Decorator“ yra „Python“ dizaino modelis. Tai funkcija, kuri kitą funkciją priima kaip argumentą, prideda tam tikrą funkciją, jos nemodifikuodama, ir grąžina kitą funkciją.
Tai vadinama „(@)“ ir dedama prieš apibrėžiant funkciją, kurią norime papuošti.
sintaksė:
@ dekoratoriaus vardas
Funkcijos apibrėžimas
Norėdami suprasti dekoratorius, turime žinoti žemiau pateiktas sąvokas.
Funkcijos yra pirmos klasės objektai. Tai reiškia, kad funkcija gali būti perduota kaip argumentas, gali būti grąžinta iš kitos funkcijos, gali būti priskirta kintamajam, gali būti apibrėžta kitoje funkcijoje. Norėdami geriau suprasti, žr. Toliau pateiktus pavyzdžius.
- Funkciją galima perduoti kaip argumentą
Pvz .: def prieaugis (n):
grįžti n + 1
def demo_funcall (funkcija):
skaičius = 5
grąžinimo funkcija (skaičius)
demo_funcall (prieaugis)Čia prieaugio funkcija perduota kaip argumentas
1 pavyzdys.py:
Išvestis:
>> python pavyzdys.py
- Funkciją galima grąžinti iš kitos funkcijos
Pvz .: def pageidauti ():
def say_wish ():
grąžinti „Su gimtadieniu“
grįžti pasakyti_ noras
labas = noras ()
Sveiki()2 pavyzdys.py:
Išvestis:
>> python pavyzdys2.py
Čia „say_wish“ funkcija grįžo iš norų funkcijos - Funkciją galima modifikuoti ir priskirti kintamajam
Pvz .: def pridėti (a, b):
grąžinti a + b
sum2nos = pridėti # Čia funkcija pridėti, priskirta kintamajam
sum2nos (5,11)3 pavyzdys.py:
Išvestis:
>> pitono pavyzdys3.py
- Apibrėžkite funkciją kitos funkcijos viduje
Pvz .: def pridėti (a, b):
def suma2 (a, b):
grąžinti a + b
res = suma2 (a, b)
grąžinti rez
pridėti (10,15)4 pavyzdys.py:
Išvestis:
>> python pavyzdys4.py
Uždarymas:
„Python“ leidžia įterptai funkcijai pasiekti išorinę uždarymo funkcijos sritį.
def sveikinimas (žinutė):„Enclosong funkcija“
def send_greeting ():
„Įterptoji funkcija“
spausdinti (pranešimas)
Siųsti linkėjimus()
sveikinimas („Labas rytas“)
5 pavyzdys.py:
Išvestis:
>> python pavyzdys5.py
Dabar supratę minėtas sąvokas, parašysime dekoratoriaus pavyzdį.
Ex1: Čia mes papuošime pranešimo funkciją. Pranešimo spausdinimas viduje ****, nekeičiant originalios funkcijos, t.e., pranešimo funkcija.
# dekoratoriaus pradžiadef print_msg (funkcija):
def apvalkalas ():
funkcija()
grąžinimo pakuotė
#dekoratoriaus pabaiga
def pranešimas ():
spausdinti („Tai pirmasis dekoratoriaus demonstravimo pavyzdys“)
labas = print_msg (žinutė)
Sveiki()
6 pavyzdys.py:
Išvestis:
>> pitono pavyzdys6.py
Paprasčiausia forma dekoratorių galime uždėti ant funkcijos apibrėžimo ir paskambinti funkcija, kaip parodyta žemiau:
Bet kokią virvelę norime papuošti viduje ***, naudokite šį dekoratorių.
Išvestis:
Keli dekoratoriai:
Vienai funkcijai galime turėti kelis dekoratorius. Čia dekoratorius pritaikomas tokia tvarka, kokia mes skambinome.
sintaksė:
@ dekoratorius2
@ dekoratorius1
Funkcijos apibrėžimas
Čia bus naudojamas 1 dekoratorius, tada 2 dekoratorius.
Argumentų perdavimas dekoratoriaus funkcijoms:
Argumentus galime perduoti įvyniojimo funkcijai. Argumentai perduoti funkcijai, kurią norime papuošti.
Pvz .:
def deco_wish (funkcija):def apvalkalas (arg1, arg2):
spausdinti ('Pateikti argumentai yra', arg1, arg2)
spausdinti ('**********************')
funkcija (arg1, arg2)
spausdinti ('**********************')
grąžinimo pakuotė
@deco_wish
def pageidavimas (a1, a2):
spausdinti (a1, a2)
linkėjimas („Geras“, „Rytas“)
linkėjimas („Geras“, „Popietė“)
7 pavyzdys.py:
Išvestis:
>> pitono pavyzdys7.py
Pateikite kintamąjį argumentų skaičių dekoratoriaus funkcijai:
Mes galime perduoti bet kokį argumentų skaičių naudodami * args (ne raktiniai žodžiai, pavyzdžiui, skaičiai) ir ** kwargs (raktiniai žodžiai, pavyzdžiui, žodynas). Abi yra poziciniai argumentai ir saugo argumentus kintamuosiuose args ir kwargs.
Pastaba: Čia vietoj args ir kwargs galime naudoti bet kokį vardą, tačiau šiuos vardus rekomenduojama naudoti.
Pvz .:
def dec_var_args (funtion):def apvalkalas (* args, ** kwargs):
spausdinti („Ne raktiniai žodžiai yra argumentai“, argumentai)
spausdinti ('Raktinių žodžių argumentai yra', kwargs)
funkcija (* argumentai)
grąžinimo pakuotė
@ dec_var_args
def fun_non_key_args (* argumentai):
nes aš arguose:
spausdinti (i)
@ dec_var_args
def fun_key_args ():
spausdinti („Raktinių žodžių argumentai“)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
8 pavyzdys.py:
Išvestis:
>> pitono pavyzdys8.py
Ex2: Tarkime, kad mes turime 2 funkcijas
1 funkcija: apskaičiuokite skaičių sumą iš pateikto sąrašo
Funkcija2: padauginkite kiekvieną skaičių iš 2 ir įtraukite juos į pateiktą skaičių sąrašą
Jei norime apskaičiuoti kiekvieno vykdymo laiką, galime tai padaryti dviem būdais
- Įdėkite kodą tarp kiekvienos funkcijos pradžios ir pabaigos laiko
- Parašykite dekoratorių laiko skaičiavimui
Žiūrėkite žemiau pateiktą kodą, išspręstą naudojant dekoratorių:
# dekoratoriaus pradžiaexe_time_calc (func):
def apvalkalas (arg):
pradžios laikas = datos laikas.datos laikas.dabar ()
func (arg)
pabaigos_ laikas = datos laikas.datos laikas.dabar ()
spausdinti ("Funkcijos vykdymo laikas" + func.__name__ + "is" + str (end_time - end_time))
grąžinimo pakuotė
#dekoratoriaus pabaiga
@exe_time_calc
def cal_avg (duomenys):
suma = 0
i duomenims:
suma + = i
spausdinti ("Nurodyto skaičių sąrašo vidurkis yra", suma // len (duomenys))
@exe_time_calc
def mul_by_2 (duomenys):
suma = 0
i duomenims:
suma + = + (i * 2)
spausdinti ("Visų skaičių suma padauginus iš 2 yra", suma)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
9 pavyzdys.py:
Išvestis:
>> pitono pavyzdys9.py
Pirmiau pateiktą dekoratorių galima naudoti bet kurios iš funkcijų vykdymo trukmei apskaičiuoti. Naudodami dekoratorių, mes galime išvengti pakartotinio kodo, kai turime reikalavimą apskaičiuoti vykdymo laiką, kad dekoratorius būtų virš funkcijos apibrėžimo.
Išvada:
Dekoratoriai keičia funkcijos / metodo funkcionalumą, nekeisdami originalaus dekoruojamos funkcijos kodo. Tai naudodami galime išvengti pakartotinio kodo rašymo. Žinodami dekoratoriaus koncepciją, būsime stiprūs python'e. Dekoratorių galime naudoti šiais atvejais:
- Patvirtinimas „Python“ sistemose Pvz .: Kolba ir Django
- Prisijungimas
- Išmatuokite vykdymo laiką