Dekoratory w Pythonie to potężna funkcjonalność, umożliwiająca modyfikację zachowania funkcji lub metod bez zmiany ich kodu źródłowego. Są one formą metaprogramowania, czyli techniki programowania, w której programy mają zdolność do traktowania innych programów jako swoich danych. W kontekście Pythona, dekoratory pozwalają na rozszerzanie i modyfikowanie funkcji dzięki wykorzystaniu wyższego rzędu funkcji (funkcji, które przyjmują inną funkcję jako argument i zwracają nową funkcję).
Przykład użycia dekoratora
Rozważmy przykład dekoratora, który mierzy czas wykonania dowolnej funkcji. To pomoże zrozumieć, jak dekoratory działają w praktyce oraz jak mogą być użyteczne w realnych zastosowaniach.
import time
# Dekorator do mierzenia czasu wykonania funkcji
def timing_decorator(function):
# Funkcja wrapper, która dodaje logikę
# pomiaru czasu do oryginalnej funkcji
def wrapper(*args, **kwargs):
start_time = time.time() # Zapisanie czasu startu
result = function(*args, **kwargs) # Wywołanie
# oryginalnej funkcji
end_time = time.time() # Zapisanie czasu zakończenia
print(f"Funkcja {function.__name__} wykonana w: "
f"{end_time - start_time:.4f} sekund.")
return result
return wrapper
# Przykład użycia dekoratora
@timing_decorator
def example_function(n):
# Funkcja, której czas wykonania będzie mierzony
sum = 0
for i in range(n):
sum += i
return sum
# Wywołanie funkcji z dekoratorem
example_function(100000)
Wyjaśnienie kodu
- Importujemy moduł
time
, aby móc mierzyć czas. - Definiujemy dekorator
timing_decorator
, który przyjmuje funkcjęfunction
jako argument. - Wewnątrz dekoratora znajduje się funkcja
wrapper
, która obejmuje oryginalną funkcję.wrapper
używa*args
i**kwargs
do przekazania dowolnej liczby argumentów do oryginalnej funkcji. - Przed i po wywołaniu oryginalnej funkcji,
wrapper
mierzy czas, aby obliczyć, ile czasu zajęło wykonanie funkcji. - Ostatecznie, dekorator zwraca funkcję
wrapper
, która teraz zawiera logikę oryginalnej funkcji wraz z dodatkowym kodem do mierzenia czasu. - Używamy dekoratora poprzez przedrostek
@timing_decorator
przed definicją funkcji, której działanie chcemy zmodyfikować. W naszym przykładzie jest toexample_function
, funkcja sumująca liczby od 0 don
. - Po wywołaniu
example_function(100000)
, oprócz oczekiwanego wyniku działania funkcji, otrzymamy również informację o czasie jej wykonania.
Podsumowanie
Dekoratory są niezwykle użytecznym narzędziem w Pythonie, pozwalającym na czyste i wygodne rozszerzanie funkcjonalności funkcji bez potrzeby zmiany ich pierwotnego kodu. Umożliwiają one dodawanie wspólnych fragmentów kodu, takich jak logowanie, mierzenie wydajności, sprawdzanie uprawnień i wiele innych, w sposób, który jest zarówno estetyczny, jak i łatwy do ponownego użycia.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs Python od podstaw w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.