使用 attrs 模块时,相同 class 的不同对象以相同的值启动

Different objects for the same class initiated with same value while working with attrs module

我正在尝试使用 attrs 模块创建模型 class。我正在使用 bson ObjectId 生成 iid 值,其中 returns 是每次调用的唯一值。并使用 time 模块生成 timestamp 值。

当我使用 User class 创建两个对象时,我发现这两个对象具有相同的值。但是它们是分开初始化的。

示例代码在这里:

from bson import ObjectId
from attrs import asdict, define, field, validators
import time


@define
class CollectionModel:
    """ Base Class For All Collection Schema"""
    iid : str =  str(ObjectId())
    timestamp : float = time.time()

    def get_dict(self):
        return asdict(self)

@define
class User(CollectionModel):
    username : str = field(factory = str, validator=validators.instance_of(str)) 
    userType : str = field(factory = str, validator=validators.instance_of(str)) 
    password : str = field(factory = str, validator=validators.instance_of(str))


user_object1 = User()
user_object2 = User()

print(user_object1)
print(user_object2)

输出:

User(iid='620bf6910e5fa38f757e35ec', timestamp=1644951185.428748, username='', userType='', password='')
User(iid='620bf6910e5fa38f757e35ec', timestamp=1644951185.428748, username='', userType='', password='')

这里,iidtimestamp对于user_object1user_object2是相同的。但预期不同。虽然对象是单独创建的,但为什么值相同?

您的默认值 iid 是常量,因为您没有将 str(ObjectId()) 包装成 attrs.Factory。它在 class 被定义并在所有实例中使用时创建一次。与 timestamp.

相同