我试图做到以下几点:
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的引用吗?
发布于 2020-07-24 02:14:03
使用__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实例来返回值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的默认值)的函数调用,而不是从类实例中调用。不过,这是非常不正统的,我不建议像这样构造您的代码。
https://stackoverflow.com/questions/63065134
复制相似问题