Назад к вопросам
Middle
81
questionbank
Что такое декоратор (Decorator) в контексте программирования и как он используется?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Декоратор - это структурный паттерн проектирования, который позволяет динамически добавлять новое поведение или обязанности объектам без модификации их структуры.
Основные идеи:
- Оборачивает существующий объект, расширяя его функциональность.
- Сохраняет интерфейс оборачиваемого объекта, обеспечивая взаимозаменяемость.
- Избегает разрастания иерархии классов при добавлении новых комбинаций поведения.
Использование:
- Расширение функциональности "на лету": Применяется, когда нужно добавить или изменить поведение объекта во время выполнения программы.
- Альтернатива наследованию: Вместо создания подклассов для каждого сочетания поведения, используются декораторы. Это более гибкий подход.
- Комбинирование поведений: Различные декораторы могут быть применены к одному и тому же объекту в разном порядке, создавая уникальные комбинации.
Пример на Python:
# Базовый компонент
class Component:
def operation(self):
pass
# Конкретный компонент
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# Базовый декоратор (хранит ссылку на оборачиваемый объект)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# Конкретный декоратор A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# Конкретный декоратор B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# Использование
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Пример в Python как синтаксический сахар @:
def my_decorator(func):
def wrapper():
print("До функции")
func()
print("После функции")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
# Вывод:
# До функции
# Привет!
# После функции