Dekoratory Pythona: funkcje zawijania i modyfikowania

Naucz się dekoratorów Pythona, jak dynamicznie modyfikować zachowanie funkcji. Zrozumienie funkcji opakowań, składni @ i obsługi argumentów w dekoratorach.

Spróbuj w Edytorze

Przegląd

Dekoratory to jeden z najbardziej eleganckich i wydajnych wzorców projektowych w Pythonie. Umożliwiają programistom modyfikowanie lub rozszerzanie zachowania funkcji, metody lub klasy bez trwałej zmiany jej kodu źródłowego. Pomyśl o dekoratorze jako opakowaniu funkcji w inną funkcję w celu wykonania kroków przed i po przetwarzaniu. To sprawia, że ​​dekoratory są idealne do wdrażania przekrojowych zagadnień, takich jak rejestrowanie, synchronizacja, walidacja lub kontrola dostępu.

W istocie dekoratorzy działają, ponieważ funkcje Pythona są obywatelami pierwszej klasy. Oznacza to, że funkcje mogą być przekazywane jako argumenty do innych funkcji, zwracane przez funkcje i przypisywane do zmiennych. Dekorator to po prostu funkcja, która przyjmuje inną funkcję jako argument, definiuje zagnieżdżoną funkcję opakowującą, która wykonuje oryginalną funkcję wraz z dodatkową logiką i zwraca tę funkcję opakowującą, aby zastąpić oryginał.

Aby stosowanie dekoratorów było proste i przejrzyste, Python udostępnia cukier składniowy `@decorator_name`, umieszczony bezpośrednio nad definicją funkcji docelowej. Wywołując funkcję dekorowaną, Python zamiast tego wywołuje opakowanie. Jeśli funkcja akceptuje parametry, opakowanie musi przyjąć dowolne argumenty (`*args` i `**kwargs`) i poprawnie je przekazać. Zrozumienie dekoratorów umożliwia pisanie wysoce modułowego, czystego i SUCHEGO (nie powtarzaj się) kodu.

Dane wyjściowe kodu i wykonania

Niestandardowy dekorator, który śledzi i rejestruje szczegóły wykonania funkcji.

decorators.py
Spróbuj w Edytorze
def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Wyjście terminala
Calling multiply with args: (5, 4)
multiply returned: 20

Wdrażanie krok po kroku

  • Rejestrowanie metryk czasu wykonywania do monitorów wydajności
  • Wymuszanie kontroli uwierzytelniania i autoryzacji na trasach
  • Buforowanie lub zapamiętywanie kosztownych wyników obliczeń

Często zadawane pytania

Jak dekoratorzy radzą sobie z argumentami?

Używając *args i **kwargs w zagnieżdżonej funkcji opakowującej, co pozwala jej odbierać i przekazywać do opakowanej funkcji dowolne parametry pozycyjne lub słowa kluczowego.

Czy możesz zastosować wiele dekoratorów do jednej funkcji?

Tak, możesz je układać w stosy. Zostaną wykonane w kolejności od góry do dołu (zawijanie od środka do najbardziej zewnętrznego).

Powiązane tematy

Polecane zasoby Pythona

Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.