Декоратор - он позволяет динамически добавлять новую функциональность объектов, не изменяя их исходный код.

Стоит использовать когда нужно добавить обязанностей объектам, когда наследование невозможно или неудобно, для многоуровневого расширения.

Используется везде, в смысле вообще везде: # Базовый компонент class FileSystemComponent(ABC): @abstractmethod # вот декоратор (с прошлого поста) def display(self, indent: int = 0): pass @contextmanager # Вот декоратор (пост про объектный пул) def get_connection(self): if len(self.pool) > 0: conn = self.pool.pop() elif len(self.in_use) < self.max_size: conn = self._create_connection() else: raise Exception("Достигнут лимит соединений") Можно использовать на любую функцию или класс: `def uppercase(func): # Собственно написанный декоратор def wrapper(): org_res = func an_res = func.upper() return an_res return wrapper

@uppercase def greed(): return print('hello')

HELLO

`def cls_decor(cls): # собственноручно написанный декоратор для класса class WrappedClass(cls): def init(self, args, **kwargs): print(f'initial {cls.name}') super.init(args, **kwargs) def str(self): return f'Wrapped {cls.name}'

@cls_decor class MyClass: def init(self, value): self.value = value def str(self): return f'MyClass with value {self.value}'

obj = MyClass(10) print(obj)

initial MyClass Wrapped MyClass MyClass with value 10

В отличие от Адаптера и Компоновщика, Декоратор меняет поведение вместо интерфейса объекта и расширяет функциональность вместо объединения объектов в структуры. #weekofpatterns````