调用基类foo方法触发RecursionError,恳请专家协助排查原因
解决Python中的RecursionError:无限递归循环问题
我来帮你揪出这个问题的根源——你遇到的RecursionError完全是因为代码里形成了无限递归循环,咱们一步步拆解清楚:
问题分析:递归循环的形成路径
当你执行c.bar()(c是Derived类的实例)时,执行流程是这样的:
- 进入
Derived.bar(),打印I am bar - 调用
self.foo(),这里的foo是基类BaseKill的方法 - 进入
BaseKill.foo(),打印what is wrong with jpython,然后调用self.bar() - 重点来了:
self是Derived的实例,所以这里调用的是重写后的Derived.bar(),而不是基类的bar - 流程回到步骤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()的流程就变成:
Derived.bar()→ 打印I am bar→ 调用self.foo()BaseKill.foo()→ 打印what is wrong with jpython→ 调用BaseKill.bar(self)BaseKill.bar()→ 打印just chill bar→ 返回None- 回到
Derived.bar()→ 调用self.hello()→ 打印say Hi - 流程正常结束,没有循环
方式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
相关产品推荐
相关产品推荐

