2014-12-03 73 views
0

我試圖重寫DaemonRunner Python標準守護進程庫(在這裏https://pypi.python.org/pypi/python-daemon/找到)覆蓋靜態成員在DaemonRunner

的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

我會覆蓋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),我們可以看到,它採用自

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 
接取屬性

因此,以前的代碼應該做的伎倆。

+0

感謝您的回答。但是,它不起作用,因爲__init __()中未定義_status。 self._status也無法按預期工作,因爲它將通過DaemonRunner :: do_action顯式傳遞來調用。可以做'self.action_funcs ['狀態'] = self._status'和'def _status(self,self_parent)',但這似乎很討厭.. – 2014-12-03 11:36:07

+0

你是對的,我沒有嘗試代碼。請看看編輯過的答案。基本上,我現在在修改action_functs之後調用基類構造函數。另外,我指定方法_status的靜態引用。 – simonemainardi 2014-12-03 13:38:57

+0

靜態引用做了竅門,謝謝! – 2014-12-03 13:59:15