2014-12-19 29 views
0

在現有的Python代碼中,我有一個基類CfgParam,它由子類層次結構擴展,如PersistentCfgParam(CfgParam),EncryptedCfgParam(CfgParam)等。每個子類都有自己的save()方法,而基類沒有:通過修改超類來影響子類中的方法?

class CfgParam: 
    def __init__(self, key, value): 
     ... 

class EncryptedCfgParam(CfgParam): 
    ... 
    def save(self): 
     ... 

我需要提供可能性作出任何小類只讀的。我很樂意可選readonly初始化參數添加到基類,如果這會工作:

class CfgParam: 
    def __init__(self, key, value, readonly=False): 
     self.readonly = readonly 
     ... 

    def save(self): 
     if self.readonly: 
      return # And possibly complain 
     # Now, call save() of the subclass??? 

但是很顯然在爲「子類的調用方法」沒有這樣的事了,反正會子請撥打自己的save(),而不是其中的一位。

有沒有辦法避免修改save()方法每個的子類?

回答

1

不,你是對的,你不能這樣做。

最佳做法是始終從您的子類方法中調用超類方法,所以如果可以保證,您可以在那裏進行檢查。

但也許更好的方法是將實施方法與save方法本身分開。這樣,子類可以覆蓋實現,但檢查仍保留在主保存中:

class CfgParam(object): 
    ... 
    def save(self): 
     if not self.readonly: 
      self._save_impl() 

    def _save_impl(self): 
     raise NotImplementedError 

class EncryptedCfgParam(CfgParam): 
    def _save_impl(self): 
     ... actual subclass save implementation ...