我试图生成一个ObjectId,这是唯一的对象,我从一个数据类。但是,对于我从类中创建的每个对象,它都会生成相同的Id。
from dataclasses import dataclass
from bson import ObjectId
@dataclass
class B:
id: ObjectId=ObjectId()
b =B()
b.id
>>ObjectId('600c9d09c889e41a182988b0')
c =B()
c.id
>>ObjectId('600c9d09c889e41a182988b0')
我不理解这种行为,是由于数据类每次初始化类时保持相同的默认objectId引用吗?
你有解决办法吗?
由于上述数据类将被初始化为:
class B:
def __init__(self, x: ObjectId = ObjectId()):
self.id=x
类的默认值始终是加载类时生成的静态ObjectId
。最后,我认为动态值不应该作为初始化参数传递。
正确的方法是使用__post_init__
:
from dataclasses import field
@dataclass
class B:
id: ObjectId = field(init=False)
def __post_init__(self):
self.id = ObjectId()
b =B()
b.id
>>ObjectId('60104262ee527a385cb44a11')
c =B()
c.id
>>ObjectId('6010426bee527a385cb44a12')