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
相关产品推荐
相关产品推荐

