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

Python类递归调用报错:'dict'对象无'rec'属性的原因解析

问题解析:Python实例方法调用与LeetCode环境差异

本地代码报错的原因

  • 你直接调用Solution.rec({},1)时,Python会把第一个参数{}绑定到实例方法的self参数上。但dict对象本身没有rec方法,所以递归执行return self.rec(x+1)时,就会抛出AttributeError。
  • 改成Solution.rec({},x+1)能运行只是巧合:你每次递归都手动传{}作为self,虽然这个对象不是Solution的实例,但因为代码里没用到self的其他属性,只是重复调用类方法并传参,所以代码能跑,但这是完全错误的用法,违背了类实例方法的设计逻辑。

正确的本地调用方式

实例方法的正确用法是先创建类的实例,再调用方法:

class Solution(object):
    def rec(self, x):
        print(x)
        if x == 25:
            return True
        return self.rec(x+1)

# 创建Solution类的实例
s = Solution()
# 调用实例方法,self会自动绑定为s
print(s.rec(1))

这样self始终是Solution的合法实例,递归调用self.rec(x+1)就能正常执行。

LeetCode环境的差异

LeetCode的判题系统会自动完成类实例化的步骤:

  1. 系统会创建Solution类的一个实例,比如s = Solution()
  2. 然后调用你写的目标方法,比如s.rec(1)

所以在LeetCode里,self是合法的Solution实例,self.rec(x+1)是标准的实例方法调用,自然能运行。
而如果你在LeetCode里写Solution.rec({},x+1),相当于手动传入了错误的self参数,不符合判题系统的调用逻辑,所以会报错。

核心知识点总结

  • Python中,定义为def func(self, ...)的是实例方法,self必须是该类的实例,用于绑定当前对象。
  • 直接通过类调用实例方法时(如Class.func(...)),必须手动传入第一个参数作为self,且该参数必须是类的实例,否则会出现属性错误。
  • LeetCode的运行机制是自动实例化你的类,再调用方法,所以你只需要在方法内部用self调用其他实例方法即可。

内容的提问来源于stack exchange,提问作者Han Fet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:07:35