Krajta

Pythonové dekoratéry

Pythonové dekoratéry
V tomto článku budeme diskutovat o dekoratérech Pythonu.

Definice: Decorator je návrhový vzor v Pythonu. Je to funkce, která bere jinou funkci jako argument, přidá k ní některé funkce bez úpravy a vrátí jinou funkci.

Tomu se říká „(@)“ a umístí se před definování funkce, kterou chceme zdobit.

syntax:

@ jméno dekora
Definice funkce

Pro pochopení dekoratérů potřebujeme znát níže uvedené pojmy.
Funkce jsou prvotřídní objekty. To znamená, že funkci lze předat jako argument, lze ji vrátit z jiné funkce, lze ji přiřadit k proměnné, lze ji definovat v jiné funkci. Pro lepší pochopení viz níže uvedené příklady.

  1. Funkci lze předat jako argument
    Příklad:

    přírůstek def (n):
    návrat n + 1
    def demo_funcall (funkce):
    num = 5
    návratová funkce (počet)
    demo_funcall (přírůstek)

    Zde byla funkce přírůstku předána jako argument

    příklad1.py:

    Výstup:

    >> python příklad1.py

  2. Funkci lze vrátit z jiné funkce
    Příklad:

    def přání ():
    def say_wish ():
    zpět "Všechno nejlepší k narozeninám"
    návrat say_wish
    ahoj = přání ()
    Ahoj()

    příklad2.py:

    Výstup:

    >> python příklad2.py

    Zde se funkce say_wish vrátila z funkce přání

  3. Funkci lze upravit a přiřadit proměnné
    Příklad:

    def add (a, b):
    vrátit a + b
    sum2nos = add # Zde je přidána funkce přidělená proměnné
    sum2nos (5,11)

    příklad3.py:

    Výstup:
    >> příklad pythonu3.py

  4. Definujte funkci uvnitř jiné funkce
    Příklad:

    def add (a, b):
    def součet2 (a, b):
    vrátit a + b
    res = součet2 (a, b)
    návrat res
    přidat (10,15)

    příklad4.py:

    Výstup:
    >> python příklad4.py

Uzavření:

Python umožňuje vnořené funkci přístup k vnějšímu rozsahu obklopující funkce.

def pozdrav (zpráva):
„Enclosong Function“
def send_greeting ():
"Vnořená funkce"
tisk (zpráva)
poslat pozdrav()
pozdrav („Dobré ráno“)

příklad5.py:

Výstup:

>> python příklad5.py

Po pochopení výše uvedených konceptů nyní napíšeme příklad dekorátoru.

Příklad 1: Zde vyzdobíme funkci zprávy. Tisk zprávy uvnitř **** bez úpravy původní funkce, tj.E., funkce zprávy.

# start dekorátoru
def print_msg (funkce):
def wrapper ():
funkce()
zpětný obal
# dekoratér konec
zpráva def ():
tisk („Toto je první příklad pro demonstraci dekoratéra“)
ahoj = print_msg (zpráva)
Ahoj()

příklad6.py:

Výstup:

>> příklad pythonu6.py

V nejjednodušší formě můžeme umístit dekorátor nad definici funkce a volat funkci, jak je znázorněno níže:

Zde bez ohledu na řetězec, který chceme vyzdobit uvnitř ***, použijte tento dekorátor.

Výstup:

Vícenásobný dekorátor:

Pro jednu funkci můžeme mít více dekoratérů. Zde se aplikuje dekorátor v pořadí, v jakém jsme ho volali.
syntax:
@ dekorátor2
@ dekorátor1
Definice funkce

Zde bude aplikován první dekoratér, poté druhý dekorátor.

Předávání argumentů funkcím dekorátoru:

Funkci wrapper můžeme předat argumenty. Argumenty předané funkci, pro kterou chceme zdobit.

Příklad:

def deco_wish (funkce):
def wrapper (arg1, arg2):
print ('Předané argumenty jsou', arg1, arg2)
tisk ('*********************')
funkce (arg1, arg2)
tisk ('*********************')
zpětný obal
@deco_wish
def přání (a1, a2):
tisk (a1, a2)
přání ('Dobré', 'Ráno')
přání („dobré“, „odpoledne“)

příklad7.py:

Výstup:

>> příklad pythonu7.py

Předat proměnný počet argumentů funkci dekoratéru:

Můžeme předat libovolný počet argumentů pomocí * args (argumenty bez klíčových slov jako čísla) a ** kwargs (argumenty klíčových slov jako slovník). Oba jsou poziční argumenty a ukládají argumenty do proměnných args a kwargs.

Poznámka: Zde můžeme použít libovolný název namísto args a kwargs, ale použití těchto jmen se doporučuje.

Příklad:

def dec_var_args (funkce):
def wrapper (* args, ** kwargs):
print ('Argumenty bez klíčových slov jsou', args)
print ('Argumenty klíčových slov jsou', kwargs)
funkce (* args)
zpětný obal
@ dec_var_args
def fun_non_key_args (* args):
pro I v args:
tisk (i)
@ dec_var_args
def fun_key_args ():
tisk („Argumenty klíčových slov“)
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

příklad8.py:

Výstup:

>> příklad pythonu8.py

Příklad 2: Předpokládejme, že máme 2 funkce
Funkce 1: Vypočítejte součet čísel z daného seznamu
Funkce 2: Vynásobte každé číslo 2 a přidejte je do daného seznamu čísel
Pokud chceme vypočítat čas, který každý potřebuje na provedení, můžeme to udělat dvěma způsoby

  1. Umístěte kód mezi počáteční a koncový čas v každé funkci
  2. Napište dekorátor pro výpočet času

Viz níže kód vyřešený pomocí dekorátoru:

# start dekorátoru
exe_time_calc (funkce):
def obal (arg):
start_time = datetime.čas schůzky.Nyní()
func (arg)
end_time = datetime.čas schůzky.Nyní()
print ("Čas potřebný k provedení funkce" + func.__name__ + "je" + str (end_time - end_time))
zpětný obal
# dekoratér konec
@exe_time_calc
def cal_avg (data):
součet = 0
pro i v datech:
součet + = i
print ("Průměr daného seznamu čísel je", sum // len (data))
@exe_time_calc
def mul_by_2 (data):
součet = 0
pro i v datech:
součet + = + (i * 2)
print ("Součet všech čísel po vynásobení 2 je", součet)
cal_avg ([10,20,30,40,50])
mul_by_2 ([10,20,30,40,50])

příklad9.py:

Výstup:

>> příklad pythonu9.py

Výše uvedený dekorátor lze použít k výpočtu doby provádění pro kteroukoli z funkcí. Použitím dekorátoru se můžeme vyhnout opakovanému kódu, když máme požadavek na výpočet doby provádění, abychom dekorátor umístili nad definici funkce.

Závěr:

Dekoratéři mění funkčnost funkce / metody, aniž by změnili původní kód funkce, která se zdobí. Díky tomu se můžeme vyhnout psaní opakovaného kódu. Znalost konceptu dekoratéra nás v pythonu zesílí. Můžeme použít dekoratér v následujících případech:

Hry Jak nainstalovat League Of Legends na Ubuntu 14.04
Jak nainstalovat League Of Legends na Ubuntu 14.04
Pokud jste fanouškem League of Legends, pak je to pro vás příležitost otestovat běh League of Legends. Všimněte si, že LOL je podporován na PlayOnLinu...
Hry Nainstalujte si nejnovější strategickou hru OpenRA na Ubuntu Linux
Nainstalujte si nejnovější strategickou hru OpenRA na Ubuntu Linux
OpenRA je herní engine Libre / Free Real Time Strategy, který obnovuje rané hry Westwood, jako je klasický Command & Conquer: Red Alert. Distribuované...
Hry Nainstalujte si nejnovější Dolphin Emulator pro Gamecube a Wii na Linuxu
Nainstalujte si nejnovější Dolphin Emulator pro Gamecube a Wii na Linuxu
Emulátor Dolphin vám umožní hrát vybrané hry Gamecube a Wii na osobních počítačích se systémem Linux (PC). Jako volně dostupný herní emulátor s otevř...