我正在尝试覆盖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的每个实例的情况下覆盖它?
答案 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
因此,以前的代码应该可以解决问题。