Ответ
Декоратор в Python — это функция, которая принимает другую функцию (или класс) и возвращает новую, модифицированную функцию, не изменяя исходный код. Это реализация паттерна «декоратор», позволяющая динамически добавлять поведение.
Пример декоратора для логирования:
import time
import functools
def log_execution_time(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__} выполнилась за {end_time - start_time:.4f} секунд")
return result
return wrapper
@log_execution_time
def calculate_factorial(n):
if n <= 1:
return 1
return n * calculate_factorial(n-1)
print(calculate_factorial(5))
# Вывод:
# calculate_factorial выполнилась за ... секунд
# 120
Почему это важно:
- Разделение ответственности: Позволяет вынести сквозную функциональность (логирование, кэширование, аутентификацию) из бизнес-логики.
- Повторное использование: Один декоратор можно применить ко многим функциям.
- Читаемость: Использование
@decoratorнад функцией явно указывает на добавленное поведение.
Ключевые моменты:
- Декораторы могут быть вложенными (
@decorator1 @decorator2). - Декораторы с аргументами требуют дополнительного уровня вложенности функций.
functools.wrapsиспользуется для корректной работы интроспекции (например,help()и имя функции).