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.
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.
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)Calling multiply with args: (5, 4)
multiply returned: 20Wdraż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
Opanuj funkcje Pythona. Dowiedz się, jak pisać kod wielokrotnego użytku za pomocą def, definiować argumenty, zwracać wartości i rozumieć zakres lokalnie i globalnie.
Menedżerowie kontekstu PythonaDowiedz się, jak pisać niestandardowe menedżery kontekstu w Pythonie. Opanuj dekorator menedżera kontekstu i metody __enter__/__exit__ w celu zapewnienia bezpieczeństwa zasobów.
Polecane zasoby Pythona
Poszerzaj swoją wiedzę dzięki powiązanym interaktywnym samouczkom, ściągawkom i porównaniom kodów.
Jak sortować listę w Pythonie
Dowiedz się, jak sortować listę w Pythonie za pomocą metody sort() i funkcji sorted(). Odkryj przykłady niestandardowego sortowania kluczy i odwrotnej kolejności.
Ściągawka dotycząca metod ciągów w Pythonie
Kompletny przewodnik dotyczący manipulacji ciągami znaków w języku Python. Opanuj formatowanie, wyszukiwanie, dzielenie, zastępowanie i sprawdzanie właściwości ciągów.
Python kontra JavaScript: który język programowania jest najlepszy?
Kompleksowe porównanie Pythona i JavaScript. Poznaj różnice w składni, wydajność, przypadki użycia (backend vs frontend) i przykłady kodowania.