在现有的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()
方法?
答案 0 :(得分: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 ...