【问题标题】:Python dataclass post initialisation for attributes属性的 Python 数据类后初始化
【发布时间】:2021-09-27 01:55:24
【问题描述】:

dataclass 的文档中,在实例初始化时进行一些额外计算时给出了以下示例:

@dataclass
class C:
    a: float
    b: float
    c: float = field(init=False)

    def __post_init__(self):
        self.c = self.a + self.b

在示例中,field 函数使用init=False 调用。我想知道为什么这是必需的,因为它似乎不需要。我错过了什么重要的事情吗?

例如,以下代码似乎也可以正常工作:

@dataclass
class C:
    a: float
    b: float

    def __post_init__(self):
        self.c = self.a + self.b
        self.d = self.a**2 + self.b**2

在调用__post_init__之前没有定义属性的第二个例子可能会导致任何问题吗?我想知道,因为我正在做类似于第二个示例的操作,但具有更多属性,并且添加了 bInitVar,我还没有发现任何问题。

【问题讨论】:

  • 第二类C 没有属性cd。只有它的实例可以。这是否是一个问题取决于您对数据类的依赖程度,好吧,数据

标签: python python-dataclasses


【解决方案1】:

在这种情况下

@dataclass
class C:
    a: float
    b: float

    def __post_init__(self):
        self.c = self.a + self.b
        self.d = self.a**2 + self.b**2

cdC 的实例中可用,但所述实例的repr 不包括该实例,例如:

somec = C(3.0,5.0)
print(somec)

输出

C(a=3.0, b=5.0)

【讨论】:

  • 好的,是的,repr 功能缺失,因为正如@MisterMiyagi 指出的那样,只有实例具有属性,而不是类。对我来说,我认为这意味着该类也应该定义属性。
猜你喜欢
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2021-11-21
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多