Pyton

Dekoratorzy Pythona

Dekoratorzy Pythona
W tym artykule omówimy dekoratory Pythona.

Definicja: Decorator to wzorzec projektowy w Pythonie. Jest to funkcja, która przyjmuje inną funkcję jako argument, dodaje do niej pewną funkcjonalność bez jej modyfikowania i zwraca inną funkcję.

Nazywa się to używaniem „(@)” i umieszcza się przed zdefiniowaniem funkcji, którą chcemy ozdobić.

składnia:

@nazwa dekoratora
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że być zdefiniowana w innej funkcji. Dla lepszego zrozumienia zobacz poniższe przykłady.

  1. Funkcję można przekazać jako argument
    Dawny:

    przyrost def(n):
    powrót n + 1
    def demo_funcall (funkcja):
    liczba = 5
    funkcja powrotu (liczba)
    demo_funcall (przyrost)

    Tutaj funkcja inkrementacji przekazana jako argument

    Przykład 1.py:

    Wynik:

    >> przykład pytona1.py

  2. Funkcja może zostać zwrócona z innej funkcji
    Dawny:

    zdefiniuj życzenie():
    def powiedz_życzenie():
    powrót "Wszystkiego najlepszego"
    powrót say_wish
    cześć = życzę ()
    cześć()

    przykład2.py:

    Wynik:

    >>Przykład Pythona2.py

    Tutaj funkcja say_wish zwrócona z funkcji życzeń

  3. Funkcja może być modyfikowana i przypisywana do zmiennej
    Dawny:

    def dodaj(a,b):
    zwróć +b
    sum2nos = add # Tutaj funkcja add przypisana do zmiennej
    sum2nos(5,11)

    przykład3.py:

    Wynik:
    >> przykład Pythona3.py

  4. Zdefiniuj funkcję wewnątrz innej funkcji
    Dawny:

    def dodaj(a,b):
    def suma2(a,b):
    zwróć a + b
    res = suma2(a,b)
    zwrot res
    dodaj(10,15)

    przykład4.py:

    Wynik:
    >> przykład Pythona4.py

Zamknięcie:

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

def powitanie (wiadomość):
„Funkcja otaczania”
def wyślij_pozdrowienie():
„Funkcja zagnieżdżona”
drukuj (wiadomość)
wysłać pozdrowienia()
powitanie("Dzień dobry")

przykład5.py:

Wynik:

>> przykład Pythona5.py

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

Przykład 1: Tutaj udekorujemy funkcję wiadomości. Drukowanie wiadomości wewnątrz **** bez modyfikowania oryginalnej funkcji, i.mi., funkcja wiadomości.

#start dekoratora
def print_msg(funkcja):
def wrapper():
funkcjonować()
opakowanie zwrotne
#dekorator koniec
def wiadomość():
print("To jest pierwszy przykład demonstracji dekoratora")
cześć = print_msg(wiadomość)
cześć()

przykład6.py:

Wynik:

>> przykład Pythona6.py

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

Tutaj jakikolwiek sznurek, który chcemy ozdobić w środku ***, użyj tego dekoratora.

Wynik:

Wielokrotny dekorator:

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

Tutaj zostanie zastosowany pierwszy dekorator, a następnie drugi dekorator.

Przekazywanie argumentów do funkcji dekoratora:

Możemy przekazać argumenty do funkcji opakowującej. Argumenty przekazywane do funkcji, dla której chcemy udekorować.

Dawny:

def deco_wish(funkcja):
def wrapper (arg1, arg2):
print ('Przekazywane argumenty to ',arg1, arg2)
drukuj ('*************************')
funkcja (arg1, arg2)
drukuj ('*************************')
opakowanie zwrotne
@deco_wish
def życzenie(a1, a2):
drukuj(a1,a2)
życzę („Dobry”, „Rano”)
życzę („Dobrze”, „Popołudnie”)

przykład7.py:

Wynik:

>> przykład Pythona7.py

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

Możemy przekazać dowolną liczbę argumentów za pomocą *args (argumenty niebędące słowami kluczowymi, takie jak liczby) i **kwargs (argumenty niebędące słowami kluczowymi, takie jak słownik). Oba są argumentami pozycyjnymi i przechowują je w zmiennych args i kwargs.

Uwaga: Tutaj możemy użyć dowolnej nazwy zamiast args i kwargs, ale zaleca się używanie tych nazw.

Dawny:

def dec_var_args(funkcja):
def wrapper(*args, **kwargs):
print('Argumenty niebędące słowami kluczowymi to', args)
print('Argumenty słów kluczowych to', kwargs)
funkcja(*argumenty)
opakowanie zwrotne
@dec_var_args
def fun_non_key_args(*args):
dla I w argumentach:
drukuj(i)
@dec_var_args
def fun_key_args():
print("Argumenty słów kluczowych")
fun_non_key_args((4,5,6))
fun_key_args(fname='Anand', lname='Matematyka')

przykład8.py:

Wynik:

>> przykład Pythona8.py

Przykład 2: Załóżmy, że mamy 2 funkcje
Funkcja1: Oblicz sumę liczb z podanej listy
Funkcja 2: Pomnóż każdą liczbę przez 2 i dodaj je do podanej listy liczb
Jeśli chcemy obliczyć czas potrzebny każdemu na wykonanie, możemy to zrobić na 2 sposoby

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

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

#start dekoratora
exe_time_calc(funkcja):
def wrapper(arg):
czas_początku = data/godzina.data i godzina.teraz()
funkcja(arg)
czas_zakończenia = data/godzina.data i godzina.teraz()
print ("Czas wykonania funkcji" + func.__name__ + " to " + str(end_time - end_time))
opakowanie zwrotne
#dekorator koniec
@exe_time_calc
def cal_śr(dane):
suma = 0
dla mnie w danych:
suma += i
print ("Średnia z podanej listy liczb to ", sum//len(data))
@exe_time_calc
def mul_by_2(dane):
suma = 0
dla mnie w danych:
suma += + (i*2)
print ("Suma wszystkich liczb po pomnożeniu przez 2 to ", suma)
cal_średnia ([10,20,30,40,50])
mul_by_2([10,20,30,40,50])

przykład9.py:

Wynik:

>> Przykład pytona9.py

Powyższy dekorator można wykorzystać do obliczenia czasu wykonania dowolnej funkcji of. Używając dekoratora, możemy uniknąć powtarzania kodu, gdy mamy wymóg obliczenia czasu wykonania, aby umieścić dekorator nad definicją funkcji.

Wniosek:

Dekoratorzy zmieniają funkcjonalność funkcji/metody bez zmiany oryginalnego kodu dekorowanej funkcji. Korzystając z tego, możemy uniknąć pisania powtarzającego się kodu. Znajomość koncepcji dekoratora sprawi, że będziemy silni w pytonie. Dekorator możemy zastosować w poniższych przypadkach:

Gry Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Wielu twórców gier i wydawców wymyśla remaster HD starych gier, aby przedłużyć żywotność serii, prosimy fanów o kompatybilność z nowoczesnym sprzętem ...
Gry Jak używać AutoKey do automatyzacji gier Linux
Jak używać AutoKey do automatyzacji gier Linux
AutoKey to narzędzie do automatyzacji pulpitu dla systemów Linux i X11, zaprogramowane w Python 3, GTK i Qt. Korzystając ze skryptów i funkcji MAKRO, ...
Gry How to Show FPS Counter in Linux Games
How to Show FPS Counter in Linux Games
Linux gaming got a major push when Valve announced Linux support for Steam client and their games in 2012. Since then, many AAA and indie games have m...