Ответ
Декоратор — это структурный паттерн проектирования, который позволяет динамически добавлять новую функциональность объектам, оборачивая их в специальные классы-обертки.
Основная идея — следование принципу открытости/закрытости: можно расширять поведение объекта, не изменяя его исходный код.
Как это работает
- Создается интерфейс, общий для «декорируемого» объекта и «декоратора».
- Класс-декоратор содержит ссылку на декорируемый объект.
- Декоратор выполняет свою дополнительную логику до или после вызова метода оригинального объекта.
Пример в Python
В Python идея декоратора элегантно реализуется через синтаксис @
, который чаще всего применяется к функциям.
import functools
import time
# Декоратор для измерения времени выполнения функции
def timer(func):
@functools.wraps(func) # Сохраняет метаданные (имя, docstring) исходной функции
def wrapper(*args, **kwargs):
start_time = time.perf_counter()
result = func(*args, **kwargs)
end_time = time.perf_counter()
run_time = end_time - start_time
print(f"Функция '{func.__name__}' выполнилась за {run_time:.4f} с")
return result
return wrapper
@timer
def process_data(data):
"""Имитирует долгую обработку данных."""
time.sleep(1)
return f"Обработано {len(data)} элементов"
print(process_data([1, 2, 3]))
# Вывод:
# Функция 'process_data' выполнилась за 1.0012 с
# Обработано 3 элементов
Основные преимущества
- Гибкость: Функциональность можно добавлять и убирать во время выполнения.
- Компонуемость: Декораторы можно применять цепочкой, комбинируя их поведение.
- Избегание наследования: Позволяет избежать создания множества подклассов для каждой комбинации поведений.