Нарушает ли шаблон декоратора принципы SOLID?

Допустим, у нас есть такой класс компонента:

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

Может ли кто-нибудь внести ясность по этому поводу?


person Samaruman    schedule 23.03.2021    source источник
comment
Имейте в виду, что Python позволяет вам реализовать шаблон Decorator таким образом, чтобы он автоматически перенаправлял операции, используя, например, __getattr__. Вы спрашиваете о шаблоне Decorator в целом или, скорее, о реализации, показанной здесь?   -  person MisterMiyagi    schedule 23.03.2021
comment
Я спрашиваю в целом, но не могли бы вы связать меня с дополнительной информацией об этой пересылке, пожалуйста? Я все еще адаптируюсь к Python с Java.   -  person Samaruman    schedule 23.03.2021
comment
См. Реализация шаблона декоратора в Python для примера использования __getattr__.   -  person MisterMiyagi    schedule 23.03.2021
comment
Добавление метода к Component нарушает принцип открытости/закрытости, независимо от того, есть у него декоратор или нет.   -  person jaco0646    schedule 23.03.2021