Допустим, у нас есть такой класс компонента:
class Component:
def operation(self) -> str:
return f"Performing operation"
def another_operation(self) -> str:
return f"Performing another operation"
Затем у нас есть дочерний элемент компонента, который переопределяет оба его метода:
class ChildComponent(Component):
def operation(self) -> str:
return f"Performing operation differently"
def another_operation(self) -> str:
return f"Performing another operation differently"
Затем мы можем определить декоратор, который изменяет поведение операции:
class Decorator(Component):
_component: Component = None
def __init__(self, component: Component) -> None:
self._component = component
def operation(self) -> str:
return f"Decorated...({self._component.operation()})"
def another_operation(self) -> str:
return self._component.another_operation()
Насколько я понимаю, даже если мы не изменяем поведение another_operation()
в декораторе, мы все равно должны определить его, а не полагаться на метод суперкласса, иначе вместо метода ChildComponent будет вызываться another_operation()
компонента, и у вас будет плохая гибридная ситуация. на ваших руках.
Однако если бы мы это сделали, то каждый раз, когда класс Component получал новый метод, нам пришлось бы добавлять его и в декоратор, что не соответствует принципу разделения интерфейса. Таким образом, мы либо нарушаем принципы SOLID и поддерживаем вдвое больше кода, чем нам нужно, либо рискуем использовать неправильные методы для тех, которые мы явно не переопределяем в декораторе.
Может ли кто-нибудь внести ясность по этому поводу?
__getattr__
. Вы спрашиваете о шаблоне Decorator в целом или, скорее, о реализации, показанной здесь? - person MisterMiyagi   schedule 23.03.2021__getattr__
. - person MisterMiyagi   schedule 23.03.2021Component
нарушает принцип открытости/закрытости, независимо от того, есть у него декоратор или нет. - person jaco0646   schedule 23.03.2021