Python继承与递归方法重写:如何避免子类方法递归触发
问题描述
现有如下Python代码:
class A: def m(self, v): for i in range(v): print("A") self.m(v-1) class B(A): def m(self, value): print("B") super(B, self).m(value) B().m(3)
实际输出:B A B A B A
期望输出:BAAAA
核心问题:类A的m方法中,self是B的实例,导致递归调用的是B的m方法,而非A自身的m方法,且无法修改方法名称,需要解决这个问题。
解决方案
方法1:直接调用A类的方法
修改A类的m方法,递归时明确指定调用A类的m方法,绕过实例的方法查找机制,这样就不会触发子类的重写逻辑:
class A: def m(self, v): for i in range(v): print("A") # 直接调用A类的m方法,传入当前self实例 A.m(self, v-1) class B(A): def m(self, value): print("B") super(B, self).m(value) B().m(3)
运行后输出符合期望:BAAAA
方法2:使用私有方法封装核心逻辑
把A类中m方法的核心递归逻辑放到一个私有方法中(Python会自动对私有方法做名称修饰,子类无法重写),然后A的m方法调用这个私有方法,递归时也直接调用私有方法:
class A: def m(self, v): self.__m_core(v) # 私有方法,名称会被修饰为_A__m_core,子类无法重写 def __m_core(self, v): for i in range(v): print("A") self.__m_core(v-1) class B(A): def m(self, value): print("B") super(B, self).m(value) B().m(3)
这种方式既保留了对外的m方法名不变,又确保递归时只执行A类的逻辑,输出同样为BAAAA
内容的提问来源于stack exchange,提问作者Bishwa Karki
相关产品推荐
相关产品推荐

