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

调用基类foo方法触发RecursionError,恳请专家协助排查原因

解决Python中的RecursionError:无限递归循环问题

我来帮你揪出这个问题的根源——你遇到的RecursionError完全是因为代码里形成了无限递归循环,咱们一步步拆解清楚:

问题分析:递归循环的形成路径

当你执行c.bar()(c是Derived类的实例)时,执行流程是这样的:

  1. 进入Derived.bar(),打印I am bar
  2. 调用self.foo(),这里的foo是基类BaseKill的方法
  3. 进入BaseKill.foo(),打印what is wrong with jpython,然后调用self.bar()
  4. 重点来了:self是Derived的实例,所以这里调用的是重写后的Derived.bar(),而不是基类的bar
  5. 流程回到步骤1,开始无限循环,直到超过Python默认的递归深度限制,触发RecursionError

解决方案:打破递归循环

根据你的需求,有两种常见的修复方式:

方式1:在基类foo中强制调用基类自身的bar

如果你希望基类的foo方法调用的是基类自己的bar,而不是派生类重写后的版本,可以直接指定基类调用,或者用super():

class BaseKill():
    def foo(self):
        print('what is wrong with jpython')
        # 调用基类自身的bar方法,避免触发派生类的bar
        return BaseKill.bar(self)
        # 也可以用super(),效果一致
        # return super().bar()
    def bar(self):
        print('just chill bar')
        return None

修复后执行c.bar()的流程就变成:

  1. Derived.bar() → 打印I am bar → 调用self.foo()
  2. BaseKill.foo() → 打印what is wrong with jpython → 调用BaseKill.bar(self)
  3. BaseKill.bar() → 打印just chill bar → 返回None
  4. 回到Derived.bar() → 调用self.hello() → 打印say Hi
  5. 流程正常结束,没有循环

方式2:调整派生类bar的逻辑

如果你的业务逻辑里不需要在Derived.bar()中调用self.foo(),那直接去掉这行代码即可:

class Derived(BaseKill):
    def bar(self):
        print('I am bar')
        # 去掉触发循环的self.foo()调用
        self.hello()
    def hello(self):
        print('say Hi')

小提示

Python默认的递归深度限制大概在1000左右,任何无限递归的代码都会触发RecursionError。遇到这类问题时,先梳理清楚方法的调用链,找到循环的节点就能轻松解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:30