通过修改超类来影响子类中的方法?

时间:2014-12-19 09:23:58

标签: python oop inheritance

在现有的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 个答案:

答案 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 ...