„Python“

„Python“ dekoratoriai

„Python“ dekoratoriai
Šiame straipsnyje aptarsime „Python Decorators“.

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.

  1. 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

  2. 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

  3. 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

  4. 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žia
def 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

  1. Įdėkite kodą tarp kiekvienos funkcijos pradžios ir pabaigos laiko
  2. Parašykite dekoratorių laiko skaičiavimui

Žiūrėkite žemiau pateiktą kodą, išspręstą naudojant dekoratorių:

# dekoratoriaus pradžia
exe_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:

„WinMouse“ leidžia tinkinti ir pagerinti pelės žymeklio judėjimą „Windows“ kompiuteryje
Jei norite pagerinti numatytąsias pelės žymiklio funkcijas, naudokite nemokamą programinę įrangą „WinMouse“. Tai prideda daugiau funkcijų, kurios padė...
Pelės kairiuoju pelės mygtuku mygtukas neveikia „Windows 10“
Jei naudojate specialią pelę su savo nešiojamuoju kompiuteriu arba staliniu kompiuteriu, tačiau neveikia pelės kairysis mygtukas dėl tam tikrų priežas...
Žymeklis peršoka arba juda atsitiktinai, kai rašote „Windows 10“
Jei pastebite, kad pelės žymeklis peršoka arba juda pats, automatiškai, atsitiktinai, kai vedate „Windows“ nešiojamąjį kompiuterį ar kompiuterį, kai k...