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

如何让嵌套Python dataclass的属性每次实例化时都生成新值

问题原因

外层exp类中直接将sum_s赋值为ClassExample(),这属于类属性,仅会在Python解析类定义的时候执行一次实例化,同时该字段没有添加类型注解,不会被dataclass识别为需要初始化的实例字段,因此后续所有新创建的exp实例都会复用同一个ClassExample对象,每次读取到的属性值都是固定的。

解决方案

嵌套的dataclass字段也需要使用default_factory来声明实例生成逻辑,同时补充类型注解让dataclass识别该字段为实例属性,保证每次创建外层类实例时都会生成新的嵌套类实例。

修正后完整代码
import random
from dataclasses import dataclass, field

@dataclass
class ClassExample:
    first: int = field(default_factory=lambda: random.choice([1, 2, 3]))
    second: int = field(default_factory=lambda: random.randint(1, 6))

@dataclass
class exp:
    # 补充类型注解,用default_factory指定每次实例化exp时都生成新的ClassExample对象
    sum_s: ClassExample = field(default_factory=ClassExample)

# 测试循环
for _ in range(3):
    current_exp = exp()
    print("first:", current_exp.sum_s.first)
    print("second:", current_exp.sum_s.second)
效果说明

运行后就会输出随机不同的first和second值,和你期望的效果一致。

内容的提问来源于stack exchange,提问作者Klevtsov Andrey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:15:05