首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dataclass:如何创建一个自动生成的不需要初始化的字段?

Dataclass:如何创建一个自动生成的不需要初始化的字段?
EN

Stack Overflow用户
提问于 2020-08-27 03:37:08
回答 1查看 2K关注 0票数 0

我使用field(init= False)来禁用初始化self.ref。然后它就是post中的一个值。下面的代码引发AttributeError: 'Data' object has no attribute 'ref'

代码语言:javascript
运行
复制
from dataclasses import dataclass, field
def make_list(): return [[0] for k in range(9)]
@dataclass
class Data:
    rows: list
    cols: list
    blocks: list
    ref: dict = field(init=False)

    def __init__(self, slots=None):
        self.rows = make_list()
        self.cols = make_list()
        self.blocks = make_list()
        if slots:
            for i in range(9):
                for j in range(9):
                    self.cols[j][i] = self.rows[i][j] = slots[i][j]

    def __post_init__(self):  
          print("post-init executed")
        self.ref = {"rows": self.rows, "cols": self.cols, "blocks": self.blocks}
test = Data()
print(test)

我使用的是python 3.8。代码在pycharm/jupyter中都经过了测试。(相同的错误)

编辑:将拼写错误:__post__init__更正为__post_init__后,我仍然收到错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-27 04:24:31

感谢@wim和@juanpa.arrivillaga

删除__init__可以解决问题,并让__post_init__再次运行。(正如wimjuanpa.arrivillaga所指出的)如果我编写自己的__init__,为什么还要费心编写__post_init__,我可以在其中编写所有我想要的后期处理。(行顺序)

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

@dataclass
class Data:
    rows: list
    cols: list = field(init=False) 
    blocks: list = field(init=False)
    ref: dict = field(init=False)

    def __post_init__(self): 
        print("post init\n\n")
        self.cols = [k*10 for k in self.rows]  # code transform rows to cols
        self.blocks = [k*20 for k in self.rows]  # code transform rows to blocks
        self.ref = {"rows": self.rows, "cols": self.cols, "blocks": self.blocks}

test = Data([1,2,3])
print(test)

此外,我可能想重新考虑使用常规类重写它,因为在这里使用dataclass不会提供比常规类更多的东西。

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

https://stackoverflow.com/questions/63604630

复制
相关文章

相似问题

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