循环实例化对象并添加至列表方法及AttributeError报错求助
问题1:在循环中实例化对象并添加到列表的方法
这事儿其实很 straightforward,核心就是先准备一个空列表,然后在循环里每次生成新的对象实例,再把它塞到列表里就行。给你举个实际的例子:
# 先定义你的类 class Product: def __init__(self, name, price): self.name = name self.price = price # 初始化空列表来存实例 product_list = [] # 用for循环实例化并添加(while循环同理) for i in range(3): # 每次循环创建一个新的Product实例 new_product = Product(f"商品{i+1}", 10 * (i+1)) # 把实例追加到列表里 product_list.append(new_product) # 验证一下结果 for item in product_list: print(f"{item.name} 价格:{item.price}")
循环结束后,product_list里就有3个Product的实例了,你可以根据自己的需求调整循环条件(比如遍历数据源、或者用while循环处理用户输入)。
问题2:解决
AttributeError: 'dict' object has no attribute 'tag' 这个错误的原因非常明确:你用json.load()从文件里读出来的myList是一个字典的列表,而不是你定义的Move类的实例列表。字典是通过[]加键名来取值的,不是用.加属性名,所以myList[-1].tag这种写法肯定会报错——字典根本没有tag这个属性。
下面给你一步步的修改方案:
第一步:修正JSON读取的取值方式
把last_tag()和last_date()里的点语法改成字典的键访问,同时建议用with语句管理文件(自动关闭文件,避免遗漏):
import json # 别忘了导入json模块,你的代码里好像没写这个! def last_tag(): with open('movements.json') as json_file: # with语句自动处理文件关闭 my_list = json.load(json_file) # 字典用键访问,比如my_list[-1]['tag'] print(my_list[-1]['tag']) return my_list[-1]['tag'] def last_date(): with open('movements.json') as json_file: my_list = json.load(json_file) print(my_list[-1]['date']) return my_list[-1]['date']
第二步:补全循环里的变量定义(额外提醒)
你的while循环里用到了my_tag,但代码里没看到它的定义,这会导致另一个错误。记得先给my_tag赋值,比如:
my_tag = "你的目标标签值" # 替换成你实际的标签来源,比如用户输入、其他变量 while True: tag_rilevato = last_tag() if my_tag == tag_rilevato: m = Move(my_tag, const_weight, last_date()) moves_list.append(m) # 一定要加退出循环的条件,不然会无限跑! quit_signal = input("输入q退出循环:") if quit_signal.lower() == 'q': break
额外优化:把JSON字典转成Move实例
如果你希望读取JSON后直接得到Move对象的列表(这样就能用.tag这种写法),可以在读取后做一个转换:
def load_movements_as_objects(): with open('movements.json') as f: dict_list = json.load(f) # 把每个字典转成Move实例 move_objects = [Move(item['tag'], item['quantity'], item['date']) for item in dict_list] return move_objects
之后调用load_movements_as_objects()得到的就是Move对象的列表,就可以放心用my_list[-1].tag了。
内容的提问来源于stack exchange,提问作者MBENKI
相关产品推荐
相关产品推荐

