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
相关产品推荐
相关产品推荐

