能否创建dataclass的不同实例?类属性与实例属性疑问
关于dataclass创建多实例的问题解答
核心结论
dataclass完全可以创建多个不同的实例,你的代码问题出在属性定义方式错误,把实例属性写成了类属性,并非dataclass只能用于单实例场景。
问题原因分析
你写的dataclass代码中:
@dataclass class B: time = datetime.now()
这里的time是类属性,只会在类定义的那一刻执行一次datetime.now(),所有实例都会共享这个固定值,所以两次实例化的time完全相同。
而普通类的写法:
class A: def __init__(self): self.time = datetime.now()
self.time是实例属性,每次创建实例时都会执行datetime.now()生成新的时间,所以两次实例的time不同。
正确的dataclass实现方式
有两种常用方法可以实现和普通类相同的逻辑:
方法1:使用field的default_factory
from dataclasses import dataclass, field from datetime import datetime from time import sleep @dataclass class B: time: datetime = field(default_factory=datetime.now) b1 = B().time sleep(1) b2 = B().time assert b1 != b2 # 断言成立,正常运行
default_factory会在每个实例创建时调用指定的函数,生成专属该实例的属性值,完美符合需求。
方法2:利用__post_init__钩子
from dataclasses import dataclass from datetime import datetime from time import sleep @dataclass class B: time: datetime | None = None def __post_init__(self): # 在自动生成的__init__执行后初始化属性 if self.time is None: self.time = datetime.now() b1 = B().time sleep(1) b2 = B().time assert b1 != b2 # 断言成立,正常运行
__post_init__是dataclass提供的后置初始化方法,适合处理需要动态计算的属性,逻辑和普通类的__init__非常相似。
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

