【发布时间】:2020-04-07 20:27:06
【问题描述】:
所以,我正在构建一组简单的服务,我厌倦了必须手动实例化和硬编码很多我知道 Python 可以动态完成的事情。具体来说,我要做的是设置一个简单的服务管理器,以便我可以控制电源开/关/重置。现在,我已经知道如何让 Python 执行该实际功能,但我想抽象出一些东西,所以在高层次上,开发人员或用户可以执行以下操作:
Service.power.reboot
我基本上想要一个主类(服务),它可以将特定服务和操作(分别为电源和重启)作为参数。这将有一个网络服务,一个存储服务等。我到目前为止所做的如下:
class Service:
def __init__(self, service, action):
self.service = service
self.action = action
def start(self): # action to be performed
pass
def stop(self):
pass
def restart(self):
pass
def enable(self):
pass
def disable(self):
pass
def status(self):
pass
我希望它做的一个伪代码版本,我认为它会更好并且更多地拆分代码:
Class Service:
def __init__(self, service, action):
self.service = service
self.action = action
def parse_request(self):
# figure out what the user wants to do to what, return the class and method
return serviceClass, serviceAction
def do_what_the_user_wants(self):
# call the class, run the method
return class.method
class PowerService:
def __init__(self, action):
self.action = action
def _parse_and_run_user_action_request:
# voodoo here to iterate over the available methods for self and run
return result
def run(self):
# run some power-related thing
return result
def stop(self):
# stop some power-related thing
return result
etc...
在这种情况下,用户就像 Service('power', 'reboot') 或更理想的 Service.power.reboot(),服务模块接受参数(或服务之后的任何内容。),数字找出要调用的实际服务和运行的方法等等。
名为 Power 的服务是一个继承自该服务的类,但我想知道是否应该在 init 期间做一些事情来解析给定的参数,决定它要做什么,然后动态地调用类并执行给定的操作,而不必实际单独输入类。我想这样会更好(没有代码,只是显示我的意思的流程):
用户想要重启电源 -> 服务类获取命令使用电源类及其方法重启 -> 服务类接受两个参数,对类进行分类并动态运行该方法 -> 电源类运行重启方法,返回状态 - > 服务类返回结果给用户
让我感到困惑的主要部分很简单:我如何制作一个 impl/API/factory 或其他任何东西来获取一堆复杂的模块并使用 API(各种)来获取字符串甚至点符号作为参数,以便“API”类或 impl 或其他任何东西知道如何处理它们?
我只是没有找到任何可以正确解释它的东西。我知道 python 可以动态调用函数、方法、类及其相关的属性、道具等。我只是找不到具体的方法,或者至少找不到有意义的设计模式。
很抱歉这篇冗长的帖子。
【问题讨论】:
-
您通常可以将实例和方法的字符串名称传递给类,然后该类使用 getattr 进行查找。
-
好的。你认为你可以给我看一个例子或者澄清它是如何工作的吗?我已经阅读了一些文章和教程,只是没有点击。
标签: python abstract-class abstraction code-splitting class-factory