Python 数据类 post 属性初始化

Python dataclass post initialisation for attributes

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__之前没有定义属性的第二个示例是否可能导致任何问题?我想知道,因为我正在做类似于第二个示例的事情,但具有更多属性,并且 b 是一个 InitVar,而且我还没有发现任何问题。

在这种情况下

@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)