python - 重构。试图让代码更优雅。需要设计模式
问题描述
无需赘述。我有这样的结构:
class someClass():
def __init__(self, m):
if m == 1:
self.mode1()
elif m == 2:
self.mode2()
elif m == 3:
self.mode3()
.....
elif m == 10:
self.mode10()
这是一个具有不同操作模式的类。将变量传递m
给类我想设置运行类的相应方法的操作模式。有没有办法更优雅地做到这一点并摆脱“if”语句?对于这种特定情况,可能有一些设计模式吗?
解决方案
最终我使用了策略模式。感谢@Robin 的建议。
class Strategy(ABC):
@abstractmethod
def execute(self):
pass
class Context():
def __init__(self, strategy: Strategy):
self._strategy = strategy
@property
def strategy(self):
return self._strategy
@strategy.setter
def strategy(self, strategy: Strategy):
self._strategy = strategy
def executeStrategy(self):
self._strategy.execute()
class mode0(Strategy):
def execute(self):
logging.info("MODE 0")
class mode1(Strategy):
def execute(self):
logging.info("MODE 1")
class mode2(Strategy):
def execute(self):
logging.info("MODE 2")
.....
然后
class someClass():
def __init__(self, m):
modesList = [mode0, mode1, mode2, mode3, mode4, mode5,
mode6, mode7, mode8, mode9, mode10, mode11]
ctx = Context(modesList[m]())
ctx.executeStrategy()
推荐阅读
- c# - 填充 Span 的最快方式
在.NET 中使用整数枚举? - python - 通过 docker-py 使用管道
- r - 带有 kableExtra 包的编织表未显示所需的输出格式
- azure - 如何在广告 b2c 自定义策略中添加类型为“StringCollection”的声明
- apache-spark - 屏蔽/替换 Pyspark 中字符串列的内部
- r - 我应该如何处理 R 中多个变量的异常值?
- c# - 模型列表属性在控制器中的 Post 上为 NULL
- laravel - 主键的 laravel 雄辩的字符串字段出现数据错误
- mongodb - 聚合子文档,按 id 列表过滤它们,并按 id 分组值
- pytorch - Pytorch中的自定义距离损失函数?