首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在dataclass字段中引用“`self`”?

如何在dataclass字段中引用“`self`”?
EN

Stack Overflow用户
提问于 2020-07-24 00:39:45
回答 1查看 7.3K关注 0票数 7

我试图做到以下几点:

代码语言:javascript
复制
class A:
    def __init__(self):
        self.b = self.get_b()

    def get_b(self):
        return 1

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

代码语言:javascript
复制
@dataclass
class A:
    b = self.get_b()

    def get_b(self):
        return 1

说明self不是在b的范围内定义的。在这里可以获得对self的引用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-24 02:14:03

使用__post_init__方法。

代码语言:javascript
复制
from dataclasses import dataclass, field


@dataclass
class A:
    b: int = field(init=False)

    def __post_init__(self):
        self.b = self.get_b()

不是很好,是吗?分配给字段的默认值等效于__init__中的默认参数值,例如,

代码语言:javascript
复制
def __init__(self, b=0):
    self.b = b

就像不能在这样的参数默认值中使用self一样,也不能将其用作字段默认值。在实例实际存在之前,默认值必须存在。

我们显式地创建字段,以便传递init=False,从而防止生成的__init__方法期望参数初始化self.b

如果函数get_b实际上独立于实例(也就是说,不需要A实例来返回值1),则可以使用已经定义的函数作为默认工厂。

代码语言:javascript
复制
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的默认值)的函数调用,而不是从类实例中调用。不过,这是非常不正统的,我不建议像这样构造您的代码。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63065134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档