如何在数据类字段中引用“self”?

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),而不是从类实例中调用。不过,这是相当不正统的,我不建议像这样构建代码。