【问题标题】:Create timestamp inside of dataclass when class is instantiated实例化类时在数据类中创建时间戳
【发布时间】:2021-08-18 02:31:53
【问题描述】:

我正在使用数据类,我想在每次创建类的实例时创建一个时间戳,如下所示:

@dataclass
class test:
    timestamp: datetime = datetime.utcnow()

test1 = test()

但是,这样做会在我运行原始类对象的代码时产生一个时间戳。也就是说,新实例都具有相同的时间戳。

下面的方法可以满足我的要求,但我不明白为什么。我认为上述方法也应该有效,因为没有创建该类的实例。为什么我必须用那种字段方法来编写它?

@dataclass
class test:
timestamp: datetime = field(default_factory=datetime.utcnow)

test1 = test()
test1.timestamp

【问题讨论】:

    标签: python class datetime python-dataclasses


    【解决方案1】:

    在第一种情况下,datetime.utcnow() 在定义类时被评估。这有效地为该字段提供了默认值。当您创建该类的一个对象时,该评估不会再次完成 - 因此您只剩下一个与您创建的该类的所有实例共享的单个值。

    另一方面,default_factory 使用一个可调用对象,每当创建该类的新实例时调用该可调用对象 - 并且该调用的结果用于填充该字段。因此,当您创建 test 类的对象时,datetime.utcnow() 将再次运行,并且该实例中存在更新的时间戳。

    阅读docs了解更多信息。

    【讨论】:

    • 谢谢rdas,非常感谢您的解释!!!这很有帮助。
    【解决方案2】:

    dataclasses.field 的文档说明:

    …一些需要额外的每个字段信息的数据类特性。为了满足对附加信息的需求,您可以将默认字段值替换为对提供的 field() 函数的调用。
    . . .
    如果通过调用field() 指定了字段的默认值,则该字段的类属性将被指定的默认值替换。如果没有提供默认值,那么类属性将被删除。其目的是在dataclass() 装饰器运行后,类属性将全部包含字段的默认值,就像指定了默认值本身一样。

    【讨论】:

    • 谢谢你,andrewalenta,谢谢你分享这个。这澄清了它。
    猜你喜欢
    • 2015-05-31
    • 2022-07-02
    • 1970-01-01
    • 2014-11-29
    • 2021-09-06
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2018-06-24
    相关资源
    最近更新 更多