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)
代码说明
- 移除了原代码中错误的循环赋值逻辑,改为直接通过
cls(new_list, "NO")创建新实例,传入更新后的列表值。 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
相关产品推荐
相关产品推荐

