0

所以,我正在构建一组简单的服务,我厌倦了必须手动实例化和硬编码很多我知道 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 可以动态调用函数、方法、类及其相关的属性、道具等。我只是找不到具体的方法,或者至少找不到有意义的设计模式。

很抱歉这篇冗长的帖子。

4

1 回答 1

0

还有另一种选择是将实例的方法传递给服务类:

class Service:

    def __init__(self, action):
        self.action = action

    def doAction(self):  # action to be performed
        self.action()

class PowerService:

    def reboot(self):
        # Do some booty things

power = PowerService()

rebooter = Service(power.reboot)

rebooter.doAction()  # calls power.reboot()
于 2020-04-08T07:46:44.997 回答