如何循环遍历dataclass字段为实例赋值,解决__setattr__报错
错误原因
- 你代码中
X = VData是将类本身赋值给了X,而非创建VData的实例对象,__setattr__只能作用于类实例,不能直接作用于类本身,因此抛出对应错误。 - 原代码中调用
__setattr__的传参方式也不符合规范,不需要额外把类/实例作为第一个参数传入。
正确实现代码
from random import randint from dataclasses import dataclass @dataclass class VData: var_a: list = None var_b: list = None var_c: list = None # 第一步:实例化dataclass对象 X = VData() # 遍历字段完成赋值 for var in VData.__dataclass_fields__: l = [randint(0, 10), randint(0,10)] setattr(X, var, l)
验证输出示例
print(X.var_a) print(X.var_b) print(X.var_c)
输出参考:
[2, 9] [10, 4] [7, 1]
额外优化建议
如果要规避dataclass可变默认值的潜在问题,推荐显式用field声明默认值:
from dataclasses import dataclass, field @dataclass class VData: var_a: list = field(default=None) var_b: list = field(default=None) var_c: list = field(default=None)
内容的提问来源于stack exchange,提问作者xtlc
相关产品推荐
相关产品推荐

