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
c
和d
在C
的实例中可用,但repr
不包括该实例,例如:
somec = C(3.0,5.0)
print(somec)
产出
C(a=3.0, b=5.0)
在 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
c
和d
在C
的实例中可用,但repr
不包括该实例,例如:
somec = C(3.0,5.0)
print(somec)
产出
C(a=3.0, b=5.0)