【问题标题】:How would I make 3 classes work together in a single base class in Python 3?我如何让 3 个类在 Python 3 的一个基类中一起工作?
【发布时间】: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 进行查找。
  • 好的。你认为你可以给我看一个例子或者澄清它是如何工作的吗?我已经阅读了一些文章和教程,只是没有点击。
  • 以下是通过字符串名称调用functions 和通过字符串名称调用methods 的示例。

标签: python abstract-class abstraction code-splitting class-factory


【解决方案1】:

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

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多