如何在子班级实施和注入策略

时间:2019-02-08 09:36:31

标签: python

有人可以帮助我了解子类中是否存在更好的方法(从常见策略列表中)实施注入策略。请在下面找到示例代码。

我不完全相信将这些策略包装为静态方法,并在基类中将策略的值提供为None。这是因为这里没有发生策略注入强制实施,并且使用继承来解决此问题看起来不自然/显而易见。

我能以更好的方式实现吗?

def strategy1():
    print("strategy1")

def strategy2():
    print("strategy2")

class Base():
    strategy = None

class Child1(Base):
    strategy = staticmethod(strategy1)

class Child2(Base):
    strategy = staticmethod(strategy2)

class Child3(Base):
    strategy = staticmethod(strategy1)

Child1.strategy()
Child2.strategy()
Child3.strategy()

我的主要要求是

  1. 跨继承层次结构的代码(策略)重用
  2. 强制子类在覆盖基类时注入这些策略。

1 个答案:

答案 0 :(得分:1)

您可以改为使用将策略功能注入到其中的策略类:

import abc

def strategy1(self):
    print("strategy1")

class AbstractClient(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def execute(self):
        pass

class StrategizedClient(AbstractClient):
    execute = strategy1

class PlanlessClient(AbstractClient):
    pass

这需要python3,但是它将强制您的子类注入策略:

>>> StrategizedClient()
<strategy.StrategizedClient object at 0x10fd594a8>
>>> PlanlessClient()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class PlanlessClient with abstract methods execute