首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过修改超类来影响子类中的方法?

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

Stack Overflow用户
提问于 2014-12-19 09:23:57
回答 1查看 56关注 0票数 0

在现有的Python代码中,我有一个基类CfgParam,它由PersistentCfgParam(CfgParam)EncryptedCfgParam(CfgParam)等子类层次结构扩展。每个子类都有自己的save()方法,而基类没有:

代码语言:javascript
运行
复制
class CfgParam:
    def __init__(self, key, value):
       ...

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

我需要提供使任何子类只读的可能性。如果可以的话,我很乐意在基类中添加一个可选的readonly初始化参数:

代码语言:javascript
运行
复制
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()方法在中每个子类?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-19 09:39:54

不,你是对的,你不能那样做。

最佳实践总是从子类方法中调用超类方法,因此如果您能够保证这一点,就可以在那里进行检查。

但是,更好的方法可能是将实现与save方法本身分开。这样,子类可以覆盖实现,但是检查仍然保留在主保存中:

代码语言:javascript
运行
复制
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 ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27562953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档