Декоратор - он позволяет динамически добавлять новую функциональность объектов, не изменяя их исходный код.
Стоит использовать когда нужно добавить обязанностей объектам, когда наследование невозможно или неудобно, для многоуровневого расширения.
Используется везде, в смысле вообще везде:
# Базовый компонент 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````