LeetCode刷题遇NameError未定义错误及Python OOP面试相关疑问
问题解答
1. 代码错误原因及__init__相关疑问
- 报错的直接原因是类的实例方法调用时必须通过实例本身引用,也就是在
solutionMethod内部调用helperMethod时,需要加self.前缀,正确写法是self.helperMethod(input),而非直接写helperMethod(input) - 额外注意你的
helperMethod没有设置返回值,执行后属性是存储在当前Solution实例的self上,并不会返回新对象,所以赋值给currObject拿到的会是None,后续直接访问self.var1/self.var2/self.var3即可,不需要额外赋值 - 调用
helperMethod不需要强制定义__init__方法,Python支持给实例动态添加属性,你在任意实例方法里给self.xxx赋值都是合法的
2. 编程面试中这种写法的适用性
- 仅当你的解题逻辑需要维护多个跨函数的状态变量时,这种写法是可行的,能避免传递大量参数的代码冗余
- 不建议无意义使用:首先会增加不必要的代码量,浪费面试时间;其次部分OJ平台会复用同一个
Solution实例跑多个测试用例,存在self上的状态会在不同测试用例之间互相干扰,导致意料之外的报错。如果确实要这么写,建议在solutionMethod入口先初始化所有要用到的self属性,避免状态残留 - 更推荐的写法是把工具方法改成纯函数,依赖参数和返回值传递数据,比依赖实例状态的写法调试成本更低,出bug的概率也更小
3. LeetCode及机考平台的测试逻辑
- 你的猜测完全正确,平台的执行逻辑就是:
soln = Solution() soln.solutionMethod(input)
- 平台会把每道题的测试用例输入传入对应的解法方法,比对返回值和预期输出是否一致,判断用例是否通过。
内容的提问来源于stack exchange,提问作者cdrootsudormstardashr
相关产品推荐
相关产品推荐

