首页 > 解决方案 > 如何在数据类字段中引用“self”?

问题描述

我正在尝试做相当于:

class A:
    def __init__(self):
        self.b = self.get_b()

    def get_b(self):
        return 1

使用@dataclass. 我想在@dataclass这里使用 a 因为还有其他(省略的)字段从提供的构造函数参数初始化。b是从实例方法的结果初始化的字段之一。执行这个:

@dataclass
class A:
    b = self.get_b()

    def get_b(self):
        return 1

表明self未在b's 范围内定义。可以参考self这里吗?

标签: pythonselfpython-dataclasses

解决方案


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


推荐阅读