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()
我的主要要求是
- 跨继承层次结构重用代码(策略)
- 强制子类在覆盖基类时注入这些策略。
解决方案
您可以改为使用将策略函数注入的策略类:
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
推荐阅读
- c# - 无法从我的脚本中引用 InputsActions
- entity-framework - 如何在实体框架中使用实体原始 SQL 查询中的数据
- c# - C# 让程序自行运行但能够在其上运行代码?
- c++ - 如何使用switch语句查找数字中数字的频率?
- ios - 如何使用核心图形绘制带有自定义图案/图像的线条/笔划?
- jupyter-notebook - Jupyter 笔记本服务器正在运行但未在浏览器中打开
- vue.js - 工作目录不是科尔多瓦项目
- jquery - 引导访问下拉菜单项元素(名称、href、文本)
- mongodb - 引用对象的猫鼬搜索属性
- excel - 建立子组并找到其局部最大值