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

Python Dataclass默认值疑问:如何为每个实例生成随机ID?

Python Dataclass 默认值中随机函数只执行一次的问题解析

为什么所有实例的id都相同?

Python类定义里的默认参数是在类定义阶段就被求值的,而非每次创建实例时。你代码里的random.randint(0,1000)在Test类被定义的瞬间就执行了一次,生成的随机数被固定成id的默认值,后续所有实例都会复用这个值。

Dataclass构造函数的工作原理

@dataclass装饰器会自动生成__init__方法。对于带默认值的字段,装饰器会把类定义时确定的默认值直接放到生成的__init__参数默认值中。如果默认值是函数调用的结果,只会在类定义时执行一次,不会在每次实例化时重复执行。

解决方法:使用field和default_factory

要让每个实例生成独立的随机id,需要借助dataclasses.field的default_factory参数——它接受一个无参函数,每次创建实例时都会调用这个函数生成默认值:

from dataclasses import dataclass, field
import random

@dataclass
class Test:
    name: str
    id: int = field(default_factory=lambda: random.randint(0, 1000))

for i in range(1, 10):
    t = Test(f"Test {i}")
    print(t.id, t.name)

也可以单独定义生成函数,提升可读性:

def generate_random_id():
    return random.randint(0, 1000)

@dataclass
class Test:
    name: str
    id: int = field(default_factory=generate_random_id)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:19:49