如何在数据类字段中引用“self”?
How to reference `self` in dataclass' fields?
我正在尝试做相当于:
class A:
def __init__(self):
self.b = self.get_b()
def get_b(self):
return 1
使用 @dataclass
。我想在这里使用 @dataclass
因为还有其他(省略的)字段从提供的构造函数参数初始化。 b
是从实例方法的结果中初始化的字段之一。执行这个:
@dataclass
class A:
b = self.get_b()
def get_b(self):
return 1
表明 self
没有定义在 b
的范围内。是否可以在此处获得对 self
的引用?
使用__post_init__
方法。
from dataclasses import dataclass, field
@dataclass
class A:
b: int = field(init=False)
def __post_init__(self):
self.b = self.get_b()
不完全是改进,是吗?分配给字段的默认值相当于 __init__
中的默认参数值,例如
def __init__(self, b=0):
self.b = b
就像你不能在这样的参数默认中使用self
一样,你也不能将它用作字段默认值。在 实例实际存在之前,默认值必须存在 。
我们显式创建字段以便我们可以传递 init=False
,防止生成的 __init__
方法期望参数初始化 self.b
。
如果函数 get_b
确实独立于实例(也就是说,您不需要 A
的实例来 return 值 1
), 你可以使用一个已经定义好的函数作为默认工厂。
from dataclasses import dataclass, field
@dataclass
class A:
def get_b(self=None):
return 1
b: int = field(default_factory=get_b, init=False)
这里,get_b
将作为零参数函数调用(因此定义中 self
的默认值),而不是从 class 实例调用。不过,这是相当不正统的,我不建议像这样构建代码。
我正在尝试做相当于:
class A:
def __init__(self):
self.b = self.get_b()
def get_b(self):
return 1
使用 @dataclass
。我想在这里使用 @dataclass
因为还有其他(省略的)字段从提供的构造函数参数初始化。 b
是从实例方法的结果中初始化的字段之一。执行这个:
@dataclass
class A:
b = self.get_b()
def get_b(self):
return 1
表明 self
没有定义在 b
的范围内。是否可以在此处获得对 self
的引用?
使用__post_init__
方法。
from dataclasses import dataclass, field
@dataclass
class A:
b: int = field(init=False)
def __post_init__(self):
self.b = self.get_b()
不完全是改进,是吗?分配给字段的默认值相当于 __init__
中的默认参数值,例如
def __init__(self, b=0):
self.b = b
就像你不能在这样的参数默认中使用self
一样,你也不能将它用作字段默认值。在 实例实际存在之前,默认值必须存在 。
我们显式创建字段以便我们可以传递 init=False
,防止生成的 __init__
方法期望参数初始化 self.b
。
如果函数 get_b
确实独立于实例(也就是说,您不需要 A
的实例来 return 值 1
), 你可以使用一个已经定义好的函数作为默认工厂。
from dataclasses import dataclass, field
@dataclass
class A:
def get_b(self=None):
return 1
b: int = field(default_factory=get_b, init=False)
这里,get_b
将作为零参数函数调用(因此定义中 self
的默认值),而不是从 class 实例调用。不过,这是相当不正统的,我不建议像这样构建代码。