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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:45:38