You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python父类内部调用自身方法触发子类重写逻辑,如何显式阻止?

这是Python的动态绑定特性导致的正常现象:self始终指向实际创建的子类实例,调用self.process时会按照实例的方法解析顺序(MRO)查找方法,优先匹配子类重写的process实现,所以才会进入DerivedClass.process。

方案1:父类方法内显式指定调用自身的process实现

不需要修改其他逻辑,只需要把SuperClass.foo中调用self.process的部分改为直接调用类的未绑定方法,手动传入self即可:

class SuperClass(UltraClass):
    def foo(self, raw, **kwargs) -> bazz:
        ...
        bazz1 = get_bazz(...)
        # 显式指定调用SuperClass自己的process方法
        return bazz1 if raw else SuperClass.process(self, bazz1)

这种方案的优势是灵活性高,只修改这一处调用逻辑,其余场景下process仍然支持子类重写覆盖,符合多态的常规使用习惯。

方案2:用双下划线名称改写禁止子类重写process

如果你希望SuperClass的process方法本身就不允许被子类重写,所有父类内部的调用都固定走父类实现,可以给方法名加双下划线前缀,触发Python的名称改写机制:

class SuperClass(UltraClass):
    def foo(self, raw, **kwargs) -> bazz:
        ...
        bazz1 = get_bazz(...)
        return bazz1 if raw else self.__process(bazz1)

    # 双下划线开头的方法会被Python内部重命名,子类无法覆盖
    def __process(self, bazz1, **kwargs) -> bazz:
        return bazz1

此时即使子类定义了同名的__process方法,Python也会将其重命名为_DerivedClass__process,和父类的_SuperClass__process是完全独立的两个方法,不会产生覆盖。

内容的提问来源于stack exchange,提问作者miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:54:03