Python AttributeError求助:int对象无tim属性问题排查
问题分析与解决方案
看起来你这里有两个关键问题需要解决:一个是类初始化时的无限递归陷阱,另一个是导致AttributeError: 'int' object has no attribute 'tim'的变量冲突问题。咱们一步步来理清楚:
1. 核心陷阱:类__init__中的无限递归
你在TT类的构造方法里写了self.tim=[TT() for i in range(initial_population)],这会触发无限递归——每次创建一个TT对象时,它的__init__会立即生成initial_population个新的TT实例,而每个新实例又会重复这个过程,直到Python的递归栈被耗尽。这是一个典型的设计误区,绝对不能在类的构造方法里创建自身的实例列表。
修复方法:把实例列表移到类外部
修改TT类,只保留自身属性的初始化,移除内部的tim列表定义:
class TT(object): def __init__(self): self.fitness = 0 self.tt_number = 0 # 假设lecturer、days、clas、periods、subjects都是已提前定义的变量 self.cube = [[[[[0 for i in range(lecturer)] for j in range(days)] for k in range(clas)] for l in range(periods)] for m in range(subjects)] def initialize_population(self): # 在这里实现你的初始化逻辑 pass
然后在主代码中(而不是类内部)创建TT对象的列表:
# 假设initial_population是你定义的种群数量变量 tim = [TT() for i in range(initial_population)]
2. 为什么会出现'int' object has no attribute 'tim'?
这个错误说明你在代码中尝试访问一个整数类型变量的tim属性,而不是TT对象的。常见的原因是:
- 你在主方法中不小心把
tim变量赋值成了整数(比如tim = 0),之后又尝试访问tim.tim; - 循环变量名和
tim列表重名,比如:# 错误示例:循环变量覆盖了tim列表 for tim in range(10): tim.tim.initialize_population() # 这里tim是循环的整数,不是TT列表
修复方法:避免变量名冲突
确保循环使用不同的变量名,正确访问tim列表中的TT对象:
# 单层循环调用示例 for tt_obj in tim: tt_obj.initialize_population() # 多层循环调用示例(如果tim是嵌套列表) for group in tim: for tt_obj in group: tt_obj.initialize_population()
总结
- 永远不要在类的构造方法中创建自身实例的列表,避免无限递归;
- 检查主代码中的变量名,不要让循环变量或其他变量覆盖你的
TT对象列表; - 确保调用方法时,访问的是
tim列表中的TT实例,而不是整数或其他类型的变量。
内容的提问来源于stack exchange,提问作者Hitesh Firake
相关产品推荐
相关产品推荐

