Python

Python Decorators

Python Decorators
V tomto článku sa budeme zaoberať dekorátormi Pythonu.

Definícia: Decorator je návrhový vzor v Pythone. Je to funkcia, ktorá vezme inú funkciu ako argument, pridá k nej nejaké funkcie bez toho, aby ich upravila, a vráti inú funkciu.

Tomu sa hovorí pomocou „(@)“ a umiestni sa pred definovanie funkcie, ktorú chceme zdobiť.

syntax:

@ meno dekoratéra
Definícia funkcie

Pre pochopenie dekoratérov musíme poznať nasledujúce koncepty.
Funkcie sú prvotriedne objekty. To znamená, že funkciu je možné odovzdať ako argument, vrátiť sa z inej funkcie, priradiť ju k premennej, definovať ju v inej funkcii. Pre lepšie pochopenie pozri nižšie uvedené príklady.

  1. Funkciu je možné odovzdať ako argument
    Príklad:

    prírastok def (n):
    návrat n + 1
    def demo_funcall (funkcia):
    num = 5
    návratová funkcia (počet)
    demo_funcall (prírastok)

    Tu funkcia prírastku prešla ako argument

    príklad1.py:

    Výkon:

    >> python priklad1.py

  2. Funkciu je možné vrátiť z inej funkcie
    Príklad:

    def wish ():
    def say_wish ():
    späť "Všetko najlepšie k narodeninám"
    návrat say_wish
    ahoj = želanie ()
    Ahoj()

    príklad2.py:

    Výkon:

    >> python priklad2.py

    Tu sa funkcia say_wish vrátila z funkcie želania

  3. Funkciu je možné upraviť a priradiť k premennej
    Príklad:

    def add (a, b):
    návrat a + b
    sum2nos = pridať # Tu je funkcia pridaná priradená k premennej
    sum2nos (5,11)

    príklad3.py:

    Výkon:
    >> python example3.py

  4. Definujte funkciu vo vnútri inej funkcie
    Príklad:

    def add (a, b):
    def sum2 (a, b):
    návrat a + b
    res = suma2 (a, b)
    návrat res
    pridať (10,15)

    príklad4.py:

    Výkon:
    >> python priklad4.py

Uzáver:

Python umožňuje vnorenej funkcii prístup k vonkajšiemu rozsahu obklopujúcej funkcie.

def pozdrav (správa):
„Enclosong Function“
def send_greeting ():
"Vnorená funkcia"
tlač (správa)
send_greeting ()
pozdrav („dobré ráno“)

príklad5.py:

Výkon:

>> python priklad5.py

Po pochopení vyššie uvedených pojmov teraz napíšeme príklad dekoratéra.

Pr1: Tu ozdobíme funkciu správy. Tlač správy vo vnútri **** bez úpravy pôvodnej funkcie, t.j.e., funkcia správy.

# štart dekorátora
def print_msg (funkcia):
def wrapper ():
funkcia ()
spätný obal
# dekorátor končí
správa def ():
tlač („Toto je prvý príklad na demonštráciu dekoratéra“)
ahoj = print_msg (správa)
Ahoj()

príklad6.py:

Výkon:

>> príklad pythonu6.py

V najjednoduchšej forme môžeme umiestniť dekorátor nad definíciu funkcie a vyvolať funkciu, ako je uvedené nižšie:

Na tento účel použite ľubovoľný reťazec, ktorý chceme vo vnútri *** vyzdobiť.

Výkon:

Viacnásobný dekorátor:

Pre jednu funkciu môžeme mať viac dekoratérov. Tu sa nanáša dekoratér v poradí, v akom sme ho volali.
syntax:
@ dekorator2
@ dekorator1
Definícia funkcie

Tu sa použije prvý dekoratér, potom druhý dekoratér.

Odovzdávanie argumentov funkciám dekoratéra:

Funkcii wrapper môžeme odovzdať argumenty. Argumenty odovzdané funkcii, ktorú chceme zdobiť.

Príklad:

def deco_wish (funkcia):
def obal (arg1, arg2):
print ('Predané argumenty sú', arg1, arg2)
tlač („**********************“)
funkcia (arg1, arg2)
tlač ('**********************')
spätný obal
@deco_wish
def želanie (a1, a2):
tlač (a1, a2)
prianie („Dobré“, „Ráno“)
prianie („dobré“, „popoludnie“)

príklad7.py:

Výkon:

>> príklad pythonu7.py

Predajte premenný počet argumentov funkcii dekorátora:

Môžeme odovzdať ľubovoľný počet argumentov pomocou * args (argumenty, ktoré nie sú kľúčovými slovami, ako sú čísla) a ** kwargs (argumenty pre kľúčové slová, ako je slovník). Oba sú pozičnými argumentmi a ukladajú argumenty do premenných args a kwargs.

Poznámka: Tu môžeme namiesto args a kwargs použiť akýkoľvek názov, ale použitie týchto mien sa odporúča.

Príklad:

def dec_var_args (funkcia):
def wrapper (* args, ** kwargs):
print ('Argumenty, ktoré nie sú kľúčovými slovami, sú', args)
print ('Argumenty kľúčového slova sú', kwargs)
funkcia (* args)
spätný obal
@ dec_var_args
def fun_non_key_args (* args):
pre I v args:
tlač (i)
@ dec_var_args
def fun_key_args ():
print („Argumenty kľúčového slova“)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

príklad8.py:

Výkon:

>> príklad pythonu8.py

Príklad 2: Predpokladajme, že máme 2 funkcie
Funkcia1: Vypočítajte súčet čísel z daného zoznamu
Funkcia2: Vynásobte každé číslo číslom 2 a pridajte ich do daného zoznamu čísel
Ak chceme vypočítať čas, ktorý každý potrebuje na vykonanie, môžeme to urobiť dvoma spôsobmi

  1. Umiestnite kód medzi čas začiatku a koniec každej funkcie
  2. Na výpočet času napíšte dekoratér

Nižšie uvedený kód vyriešený pomocou dekorátora:

# štart dekorátora
exe_time_calc (func):
def obal (arg):
start_time = datetime.Dátum Čas.teraz ()
func (arg)
end_time = dátum a čas.Dátum Čas.teraz ()
print ("Čas potrebný na vykonanie funkcie" + func.__name__ + "je" + str (end_time - end_time))
spätný obal
# dekorátor končí
@exe_time_calc
def cal_avg (údaje):
súčet = 0
pre údaje i:
suma + = i
print ("Priemer daného zoznamu čísel je", sum // len (data))
@exe_time_calc
def mul_by_2 (údaje):
súčet = 0
pre i v dátach:
suma + = + (i * 2)
print ("Súčet všetkých čísel po vynásobení 2 je", súčet)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

príklad9.py:

Výkon:

>> príklad pythonu9.py

Vyššie uvedený dekorátor je možné použiť na výpočet času vykonania ktorejkoľvek z funkcií. Použitím dekorátora môžeme zabrániť opakovaniu kódu, keď máme požiadavku na výpočet času vykonania umiestnenia dekorátora nad definíciu funkcie.

Záver:

Dekoranti menia funkčnosť funkcie / metódy bez zmeny pôvodného kódu funkcie, ktorá sa zdobí. Vďaka tomu sa môžeme vyhnúť opakovanému písaniu kódu. Poznanie konceptu maliara nás v pythone posilní. Dekorátor môžeme použiť v nasledujúcich prípadoch:

Hry Užitočné nástroje pre hráčov systému Linux
Užitočné nástroje pre hráčov systému Linux
Ak radi hráte hry v systéme Linux, je pravdepodobné, že ste na vylepšenie herného zážitku použili aplikácie a pomôcky ako Wine, Lutris a OBS Studio. O...
Hry HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
HD remasterované hry pre Linux, ktoré nikdy predtým nemali vydanie Linuxu
Mnoho vývojárov a vydavateľov hier prichádza s remastrom starých hier v rozlíšení HD, aby predĺžili životnosť franšízy. Prosím fanúšikov, ktorí požadu...
Hry Ako používať AutoKey na automatizáciu hier pre Linux
Ako používať AutoKey na automatizáciu hier pre Linux
AutoKey je obslužný program na automatizáciu stolných počítačov pre systémy Linux a X11, programovaný v programoch Python 3, GTK a Qt. Pomocou jeho fu...