← Назад к вопросам

Зачем нужен паттерн Декоратор?

1.6 Junior🔥 191 комментариев
#Python

Комментарии (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 он часто используется для добавления функциональности к функциям обработки данных и машинного обучения.

Зачем нужен паттерн Декоратор? | PrepBro