Ответ
Декоратор в Python — это функция, которая принимает другую функцию и расширяет или изменяет её поведение, не модифицируя исходный код оборачиваемой функции. Это мощный инструмент для реализации аспектно-ориентированного программирования.
Основные применения:
- Логирование: автоматическое логирование вызовов функций и их аргументов.
- Кеширование (мемоизация): сохранение результатов дорогостоящих вызовов.
- Контроль доступа: проверка прав пользователя перед выполнением функции.
- Валидация: проверка входных данных или выходных результатов.
- Замер времени выполнения: профилирование кода.
- Повторные попытки (retry): автоматический повтор вызова при сбоях.
Пример декоратора для замера времени:
import time
import functools
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
print(f"Функция {func.__name__!r} выполнилась за {end_time - start_time:.4f} сек")
return result
return wrapper
@timer
def calculate_sum(n):
return sum(range(n))
# При вызове будет выведено время выполнения
result = calculate_sum(1_000_000)
Декораторы помогают соблюдать принцип единственной ответственности (Single Responsibility Principle) и избегать дублирования кода.