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

Python中访问default_factory初始化的dataclass成员my_list时遇AttributeError如何解决?

解决dataclass中default_factory初始化列表引发的AttributeError问题

问题原因

出现AttributeError: type object 'MyClass' has no attribute 'my_list'的核心原因是:通过field(default_factory=list)定义的my_list是实例属性,仅属于类的实例对象,而非类本身。在类方法update_my_list中直接访问cls.my_list(类对象的属性),自然找不到该成员。

另外原代码里的循环赋值逻辑也存在问题:即便cls.my_list存在,初始为空列表的情况下直接通过索引赋值会触发索引越界错误。

修正后的代码

from dataclasses import dataclass, field

@dataclass
class MyClass:
    my_list: list = field(default_factory=list)
    my_string: str =''

    @classmethod
    def update_my_list(cls, new_list: list):
        cls.my_list = new_list
        return cls(new_list, "NO")


my_object = MyClass()
print(my_object.my_list)     # Output: []
print(my_object.my_string)   # Output: ""

my_object = MyClass.update_my_list([4, 5, 6])
print(my_object)

代码说明

  1. 移除了原代码中错误的循环赋值逻辑,改为直接通过cls(new_list, "NO")创建新实例,传入更新后的列表值。
  2. cls.my_list = new_list这行代码是给类添加了一个类属性,但实际创建实例时,传入的new_list会覆盖默认的实例属性初始化逻辑,不影响最终实例的my_list值。如果不需要给类添加这个属性,也可以直接删除该行,仅保留return cls(new_list, "NO")即可。

运行结果

[]
""
MyClass(my_list=[4, 5, 6], my_string='NO')

内容的提问来源于stack exchange,提问作者chandra kanth Chandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:17