Meghatározás: A Decorator egy mintázat a Pythonban. Ez egy olyan függvény, amely egy másik függvényt vesz fel argumentumként, hozzáad néhány funkciót anélkül, hogy módosítaná, és egy másik függvényt ad vissza.
Ezt hívjuk „(@)” használatával, és a díszíteni kívánt funkció meghatározása előtt helyezzük el.
szintaxis:
@dekorátor neve
Funkció meghatározása
A dekorátorok megértéséhez ismerni kell az alábbi fogalmakat.
A függvények első osztályú objektumok. Ez azt jelenti, hogy egy függvény átadható argumentumként, visszaadható egy másik függvényből, hozzárendelhető egy változóhoz, meghatározható egy másik függvényben. A jobb megértés érdekében lásd az alábbi példákat.
- Egy függvény átadható argumentumként
Volt: def növekmény (n):
n + 1 visszatérés
def demo_funcall (függvény):
szám = 5
visszatérési függvény (szám)
demo_funcall (növekmény)Itt az inkrement függvény érvként került átadásra
példa1.py:
Kimenet:
>> python példa1.py
- A függvény visszaadható egy másik függvényből
Volt: def kívánság ():
def say_wish ():
return "Boldog születésnapot"
return say_wish
szia = kívánság ()
Helló()példa2.py:
Kimenet:
>> python példa2.py
Itt a say_wish függvény visszatért a kívánságfüggvényből - A függvény módosítható és hozzárendelhető egy változóhoz
Volt: def add (a, b):
adja vissza a + b
sum2nos = add # Itt a változóhoz hozzárendelt add függvény
sum2nos (5,11)3. példa.py:
Kimenet:
>> python példa3.py
- Adja meg a függvényt egy másik függvényen belül
Volt: def add (a, b):
def sum2 (a, b):
adja vissza a + b
res = összeg2 (a, b)
return res
hozzáadás (10,15)4. példa.py:
Kimenet:
>> python példa4.py
Bezárás:
A Python lehetővé teszi, hogy egy beágyazott függvény hozzáférjen a mellékelő függvény külső hatóköréhez.
def üdvözlet (üzenet):"Enclosong Function"
def send_greeting ():
"Beágyazott funkció"
nyomtatás (üzenet)
send_greeting ()
üdvözlet ("Jó reggelt")
5. példa.py:
Kimenet:
>> python példa5.py
Miután megértette a fenti fogalmakat, írunk egy dekoratőr példát.
Ex1: Itt díszítjük az üzenet funkciót. Az üzenet nyomtatása a **** belsejében az eredeti funkció módosítása nélkül, i.e., üzenet funkció.
#dekorátor kezdetedef print_msg (függvény):
def burkoló ():
funkció()
visszatérő burkolat
#dekorátor vége
def üzenet ():
nyomtatás („Ez az első példa a dekoratőr bemutatására”)
hello = print_msg (üzenet)
Helló()
6. példa.py:
Kimenet:
>> python példa6.py
A legegyszerűbb formában elhelyezhetünk dekoratort a függvénydefiníció tetején, és meghívhatjuk a függvényt az alábbiak szerint:
Bármelyik húrt szeretnénk belül díszíteni ***, használja ezt a dekoratort.
Kimenet:
Több dekoratőr:
Több dekorátor is rendelkezhetünk egyetlen funkcióval. Itt a dekoratort az általunk hívott sorrendben alkalmazzák.
szintaxis:
@ dekoratőr2
@ dekoratőr1
Funkció meghatározása
Itt az 1. dekoratort, majd a 2. dekoratort alkalmazzák.
Argumentumok átadása a dekorátor funkcióinak:
Átadhatunk argumentumokat a wrapper függvénynek. Az argumentumok átadódtak annak a függvénynek, amelyet díszíteni szeretnénk.
Volt:
def deco_wish (függvény):def burkoló (arg1, arg2):
print ('Az átadott argumentumok:', arg1, arg2)
nyomtatás ('**********************')
függvény (arg1, arg2)
nyomtatás ('**********************')
visszatérő burkolat
@deco_wish
def kívánság (a1, a2):
nyomtatás (a1, a2)
kívánság ('Jó', 'Reggel')
kívánság ('Jó', 'Délután')
7. példa.py:
Kimenet:
>> python példa7.py
Változó számú argumentum átadása a dekorátor funkciónak:
Bármely argumentumot átadhatunk * args (Nem kulcsszó argumentumok, mint a számok) és ** kwargs (kulcsszó argumentumok, mint egy szótár) használatával. Mindkettő helyzeti argumentum, és az argumentumokat args és kwargs változókban tárolja.
Megjegyzés: Itt bármilyen nevet használhatunk args és kwargs helyett, de ezeknek a neveknek a használata ajánlott.
Volt:
def dec_var_args (funtion):def burkoló (* args, ** kwargs):
print ('A nem kulcsszó argumentumok', args)
print ('A kulcsszó argumentumai:', kwargs)
függvény (* arg)
visszatérő burkolat
@ dec_var_args
def fun_non_key_args (* args):
mert én argszban:
nyomtatás (i)
@ dec_var_args
def fun_key_args ():
nyomtatás („Kulcsszó-érvek”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')
8. példa.py:
Kimenet:
>> python példa8.py
Ex2: Tegyük fel, hogy 2 funkciónk van
Funkció1: Számítsa ki a számok összegét az adott listából
Funkció2: Minden számot szorozzon meg 2-vel, és vegye fel őket a megadott számlistára
Ha ki akarjuk számolni az egyes végrehajtáshoz szükséges időt, akkor ezt kétféleképpen tehetjük meg
- Helyezze a kódot az egyes funkciók kezdési és befejezési időpontja közé
- Írjon dekoratort az idő kiszámításához
Lásd az alábbiakban a dekorátorral megoldott kódot:
#dekorátor kezdeteexe_time_calc (func):
def burkoló (arg):
start_time = dátumidő.dátum idő.Most()
func (arg)
end_time = dátumidő.dátum idő.Most()
print ("A függvény végrehajtásának ideje" + func.__name__ + "is" + str (end_time - end_time))
visszatérő burkolat
#dekorátor vége
@exe_time_calc
def cal_avg (adatok):
összeg = 0
i-re az adatokban:
összeg + = i
print ("A megadott számlista átlaga:", összeg // len (adatok))
@exe_time_calc
def mul_by_2 (adatok):
összeg = 0
i-re az adatokban:
összeg + = + (i * 2)
print ("Az összes szám összege 2-gyel való szorzás után", összeg)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])
9. példa.py:
Kimenet:
>> python példa9.py
A fenti dekorátor bármely funkció végrehajtási idejének kiszámításához használható. Dekorátor használatával elkerülhetjük az ismételt kódot, ha követelményünk van a végrehajtási idő kiszámítására, hogy a dekorátort a funkciódefiníció fölé helyezzük.
Következtetés:
A dekorátorok megváltoztatják egy függvény / módszer funkcionalitását anélkül, hogy megváltoztatnák a függvény eredeti kódját. Ennek használatával elkerülhetjük az ismételt kódírást. A dekoratőr koncepciójának ismeretében erősek leszünk a pythonban. A dekoratort az alábbi esetekben használhatjuk:
- Engedélyezés Python keretrendszerekben Pl: Lombik és Django
- Fakitermelés
- Mérje meg a végrehajtási időt