Ответ
Декоратор в Python — это функция, которая принимает другую функцию (или класс) в качестве аргумента и возвращает новую, модифицированную функцию, обычно расширяя или изменяя её поведение. Это реализация паттерна проектирования «Декоратор», позволяющая добавлять новую функциональность к существующим объектам динамически и без изменения их исходного кода.
Зачем это нужно? Для сквозной функциональности (cross-cutting concerns), которую нужно применять ко многим функциям: логирование, тайминг, кэширование, проверка прав доступа, валидация аргументов.
Базовый пример создания и использования:
def timer_decorator(func):
"""Декоратор, замеряющий время выполнения функции."""
import time
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
# Применение декоратора с помощью синтаксиса @
@timer_decorator
def calculate_sum(n):
"""Вычисляет сумму чисел от 1 до n."""
return sum(range(1, n+1))
# Вызов выглядит как обычно, но работает с доп. функциональностью
print(calculate_sum(1_000_000))
# Вывод:
# Функция calculate_sum выполнилась за 0.0453 сек.
# 500000500000
Встроенные и популярные декораторы:
@staticmethod,@classmethod,@property— для методов классов.@functools.lru_cache(maxsize=128)— для мемоизации (кэширования) результатов функции.@dataclasses.dataclass(Python 3.7+) — для автоматической генерации boilerplate-кода в классах.