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

循环实例化对象并添加至列表方法及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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:32:49