覆盖DaemonRunner中的静态成员

时间:2014-12-03 10:03:43

标签: python python-daemon

我正在尝试覆盖python标准守护程序进程库中的DaemonRunner(在此处找到https://pypi.python.org/pypi/python-daemon/

DaemonRunner响应命令行参数的启动,停止和重启,但我想为状态添加第四个选项。

我要覆盖的类看起来像这样:

class DaemonRunner(object):
    def _start(self):
        ...etc

    action_funcs = {'start': _start}

我试图像这样覆盖它:

class StatusDaemonRunner(DaemonRunner):
    def _status(self):
        ...

    DaemonRunner.action_funcs['status'] = _status

这在某种程度上有效,但问题是DaemonRunner的每个实例现在都有新的行为。是否可以在不修改DaemonRunner的每个实例的情况下覆盖它?

1 个答案:

答案 0 :(得分:1)

我会覆盖action_functs,使其成为class StatusDaemonRunner(DaemonRunner)的非静态成员。

就代码而言,我会这样做:

class StatusDaemonRunner(runner.DaemonRunner):
    def __init__(self, app):
        self.action_funcs = runner.DaemonRunner.action_funcs.copy()
        self.action_funcs['status'] = StatusDaemonRunner._status
        super(StatusDaemonRunner, self).__init__(app)
    def _status(self):
        pass  # do your stuff

实际上,如果我们在DaemonRunner(here)的实现中查看getter,我们可以看到它使用self获取属性

    def _get_action_func(self):
    """ Return the function for the specified action.

        Raises ``DaemonRunnerInvalidActionError`` if the action is
        unknown.

        """
    try:
        func = self.action_funcs[self.action]
    except KeyError:
        raise DaemonRunnerInvalidActionError(
            u"Unknown action: %(action)r" % vars(self))
    return func

因此,以前的代码应该可以解决问题。