如何在数据类字段中引用“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 实例调用。不过,这是相当不正统的,我不建议像这样构建代码。