Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Паттерн Декоратор: назначение и практическое применение
Что такое паттерн Декоратор?
Паттерн Декоратор (Decorator) — это структурный паттерн проектирования, который позволяет динамически добавлять новые функции к объектам во время выполнения программы без изменения их исходного кода. Декоратор оборачивает объект и предоставляет ему новое поведение.
Зачем нужен паттерн?
1. Расширяемость без изменения исходного кода
- Можно добавлять функциональность к существующим классам без их модификации
- Это следует принципу Open/Closed Principle (открыт для расширения, закрыт для модификации)
2. Динамическое добавление функций
- В отличие от наследования, декоратор позволяет комбинировать функции в runtime
- Можно применить несколько декораторов подряд (цепочка декораторов)
3. Разделение ответственности
- Каждый декоратор отвечает за одну функцию
- Упрощает тестирование и поддержку кода
Примеры в Data Science
# Пример 1: Логирование времени выполнения функции
import time
from functools import wraps
def timer_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
print(f"Функция {func.__name__} выполнена за {time.time() - start:.2f}с")
return result
return wrapper
@timer_decorator
def train_model(data):
time.sleep(2)
return "Model trained"
# Пример 2: Кэширование результатов
def cache_decorator(func):
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = str(args) + str(kwargs)
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
@cache_decorator
def expensive_calculation(n):
return sum(range(n))
# Пример 3: Валидация входных данных
def validate_input(func):
@wraps(func)
def wrapper(data, **kwargs):
if data is None or len(data) == 0:
raise ValueError("Data cannot be empty")
return func(data, **kwargs)
return wrapper
@validate_input
def preprocess_data(data):
return data.normalize()
Практическое применение в ML pipeline
# Цепочка декораторов для ML процесса
@timer_decorator
@validate_input
@cache_decorator
def preprocess_and_train(data):
# Расчёты и обучение модели
return model
Преимущества и недостатки
Преимущества:
- Гибкость и расширяемость
- Избегаем explosion of subclasses
- Легко комбинировать функции
- Соответствует принципам SOLID
Недостатки:
- Может усложнить код при чрезмерном использовании
- Цепочка декораторов может быть трудна для отладки
- Порядок декораторов может быть важен
Заключение
Паттерн Декоратор — это мощный инструмент для написания чистого, модульного и расширяемого кода. В Data Science он часто используется для добавления функциональности к функциям обработки данных и машинного обучения.