Что такое декоратор в Python?

«Что такое декоратор в Python?» — вопрос из категории Python, который задают на 39% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Декоратор в 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-кода в классах.