Dekoratorzy Pythona

Dekoratorzy Pythona
W tym artykule omówimy dekoratorów Pythona.

Definicja: Dekorator to wzór projektowy w Pythonie. Jest to funkcja, która przyjmuje inną funkcję jako argument, dodaj do niej pewną funkcjonalność, nie modyfikując i zwraca inną funkcję.

Nazywa się to za pomocą „(@)” i umieszczone przed zdefiniowaniem funkcji, którą chcemy ozdobić.

składnia:

Nazwa @Decorator
Definicja funkcji

Aby zrozumieć dekoratorów, musimy znać poniższe pojęcia.
Funkcje to obiekty pierwszej klasy. Oznacza to, że funkcja może być przekazana jako argument, może być zwrócona z innej funkcji, może być przypisana do zmiennej, można zdefiniować w innej funkcji. Aby uzyskać lepsze zrozumienie, zobacz poniższe przykłady.

  1. Funkcję można przekazać jako argument
    Np.: Def przyrost (n):
    zwrócić n + 1
    def demo_funcall (funkcja):
    num = 5
    Funkcja powrotu (num)
    demo_funcall (przyrost)

    Tutaj funkcja przyrostowa przekazana jako argument

    Przykład 1.PY:

    Wyjście:

    >> przykład Python1.py

  2. Funkcję można zwrócić z innej funkcji
    Np.: Def Wish ():
    def say_wish ():
    Wróć „Wszystkiego najlepszego”
    zwróć Say_Wish
    Hello = Wish ()
    Witam()

    Przykład2.PY:

    Wyjście:

    >> przykład Python2.py

    Tutaj funkcja say_wish powróciła z funkcji życzenia

  3. Funkcję można zmodyfikować i przypisać do zmiennej
    Np.: Def add (a, b):
    Zwróć A +B
    sum2nos = Dodaj # tutaj funkcja Dodaj przypisaną do zmiennej
    sum2nos (5,11)

    Przykład3.PY:

    Wyjście:
    >> przykład Python3.py

  4. Zdefiniuj funkcję w innej funkcji
    Np.: Def add (a, b):
    def sum2 (a, b):
    Zwróć A + B
    res = sum2 (a, b)
    return res
    Dodaj (10,15)

    Przykład4.PY:

    Wyjście:
    >> przykład Python4.py

Zamknięcie:

Python umożliwia zagnieżdżoną funkcję dostęp do zewnętrznego zakresu funkcji otaczającej.

DEF GFING (wiadomość):
„Funkcja Emplosong”
def send_greeting ():
„Funkcja zagnieżdżona”
Drukuj (wiadomość)
wysłać pozdrowienia()
Powitanie („Dzień dobry”)

Przykład5.PY:

Wyjście:

>> przykład Python5.py

Po zrozumieniu powyższych pojęć teraz napiszmy przykład dekoratora.

Ex1: Tutaj udekorujemy funkcję wiadomości. Drukowanie MSG wewnątrz **** bez modyfikowania oryginalnej funkcji, i.mi., funkcja wiadomości.

#Decorator start
def print_msg (funkcja):
Def Wrapper ():
funkcjonować()
Opakowanie powrotu
#Decorator End
DEF Message ():
Drukuj („To jest pierwszy przykład demonstrowania dekoratora”)
hello = print_msg (wiadomość)
Witam()

Przykład6.PY:

Wyjście:

>> przykład Python6.py

W najprostszej formie możemy umieścić dekoratora na definicji funkcji i wywołać funkcję, jak pokazano poniżej:

Tutaj, jakikolwiek ciąg chcemy ozdobić w środku ***, użyj tego dekoratora.

Wyjście:

Wielu dekorator:

Możemy mieć wielu dekoratorów dla jednej funkcji. Tutaj dekorator jest stosowany w kolejności, którą zadzwoniliśmy.
składnia:
@dekorator2
@dekorator1
Definicja funkcji

Tutaj zostanie zastosowany 1. dekorator, a następnie 2. dekorator.

Przekazywanie argumentów do funkcji dekoratora:

Możemy przekazać argumenty do funkcji opakowania. Argumenty przekazane do funkcji, dla której chcemy ozdobić.

Były:

def deco_wish (funkcja):
Def Vrapper (Arg1, Arg2):
Drukuj („przekazane argumenty to”, arg1, arg2)
Drukuj („***********************”)
funkcja (Arg1, Arg2)
Drukuj („***********************”)
Opakowanie powrotu
@Deco_Wish
def Wish (A1, A2):
Drukuj (A1, A2)
Wish („Good”, „Morning”)
życzenie („dobre”, „popołudnie”)

Przykład7.PY:

Wyjście:

>> przykład Python7.py

Przekaż zmienną liczbę argumentów do funkcji dekoratora:

Możemy przekazać dowolną liczbę argumentów za pomocą *Args (argumenty nie-klawisze, takich jak liczby) i ** kwargs (argumenty słów kluczowych jak słownik). Oba są argumentami pozycyjnymi i przechowuje argumenty w zmiennych ARGS i KWARGS.

Uwaga: Tutaj możemy użyć dowolnej nazwy zamiast ARG i KWARG, ale te nazwy są zalecane do użycia.

Były:

def dec_var_args (funcja):
def Vrapper (*args, ** kwargs):
drukuj („argumenty słów kluczowych są”, args)
drukuj („argumenty słów kluczowych to”, Kwargs)
funkcja (*args)
Opakowanie powrotu
@ dec_var_args
def fun_non_key_args (*args):
bo w args:
Drukuj (i)
@ dec_var_args
def fun_key_args ():
Drukuj („Argumenty słów kluczowych”)
fun_non_key_args ((4,5,6))
fun_key_args (fname = „anand”, lname = „Math”)

Przykład8.PY:

Wyjście:

>> przykład Python8.py

Ex2: Załóżmy, że mamy 2 funkcje
Funkcja 1: Oblicz sumę liczb z podanej listy
Funkcja 2: Pomnóż każdą liczbę przez 2 i dodaj ją do podanej listy liczb
Jeśli chcemy obliczyć czas potrzebny dla wykonania, możemy to zrobić na 2 sposoby

  1. Umieść kod pomiędzy czasem rozpoczęcia i zakończenia w każdej funkcji
  2. Write Decorator do obliczania czasu

Zobacz poniżej kod rozwiązany za pomocą dekoratora:

#Decorator start
exe_time_calc (FUNC):
def Vrapper (arg):
start_time = DateTime.Datetime.Teraz()
FUNC (Arg)
end_time = DateTime.Datetime.Teraz()
Drukuj („Czas na wykonanie funkcji” + FUNC.__name__ + "is" + str (end_time - end_time))
Opakowanie powrotu
#Decorator End
@exe_time_calc
def cal_avg (dane):
Sum = 0
Dla i w danych:
sum += i
Drukuj („Średnia z podanej listy liczb to”, suma // len (dane))
@exe_time_calc
def mul_by_2 (dane):
Sum = 0
Dla i w danych:
sum + = + (i*2)
wydrukuj („SUME wszystkich liczb po pomnożeniu przez 2 to”, suma)
CAL_AVG ([10,20,30,40,50])
MUL_BY_2 ([10,20,30,40,50])

Przykład 9.PY:

Wyjście:

>> przykład Python9.py

Powyższego dekoratora można użyć do obliczania czasu wykonywania dla dowolnej funkcji. Korzystając z dekoratora, możemy uniknąć powtarzanego kodu, gdy mamy wymóg obliczenia czasu wykonywania, aby umieścić dekoratora nad definicją funkcji.

Wniosek:

Dekoratorzy zmieniają funkcję funkcji/metody bez zmiany oryginalnego kodu funkcji jest dekorowane. Korzystając z tego, możemy uniknąć pisania powtarzanego kodu. Znajomość koncepcji dekoratora sprawi, że będziemy silni w Python. Możemy użyć dekoratora w poniższych przypadkach:

  • Autoryzacja w Python Frameworks Ex: Flask and Django
  • Logowanie
  • Zmierz czas wykonywania