Mar*_*hac 11 python self python-dataclasses
我正在尝试做相当于:
class A:
def __init__(self):
self.b = self.get_b()
def get_b(self):
return 1
Run Code Online (Sandbox Code Playgroud)
使用@dataclass。我想在这里使用 a ,@dataclass因为还有其他(省略的)字段是从提供的构造函数参数初始化的。b是从实例方法的结果初始化的字段之一。执行这个:
@dataclass
class A:
b = self.get_b()
def get_b(self):
return 1
Run Code Online (Sandbox Code Playgroud)
表明self未在 的b范围内定义。这里可以参考一下吗self?
che*_*ner 10
使用该__post_init__方法。
from dataclasses import dataclass, field
@dataclass
class A:
b: int = field(init=False)
def __post_init__(self):
self.b = self.get_b()
Run Code Online (Sandbox Code Playgroud)
不完全是一种改进,是吗?分配给字段的默认值相当于 中的默认参数值__init__,例如,
def __init__(self, b=0):
self.b = b
Run Code Online (Sandbox Code Playgroud)
就像不能self在这样的参数默认值中使用一样,也不能将其用作字段默认值。默认值必须之前存在在实例实际存在
我们显式创建该字段,以便可以传递init=False,从而防止生成的__init__方法需要参数来初始化self.b。
如果函数get_b确实独立于实例(也就是说,您不需要 的实例A来返回 value 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)
Run Code Online (Sandbox Code Playgroud)
在这里,get_b将作为具有零参数的函数进行调用(因此定义中的默认值self),而不是从类实例中调用。不过,这是相当不正统的,我不建议像这样构建代码。