数据类:如何创建不需要初始化的字段,该字段会自动生成?

问题描述

我使用field(ini​​t = False)禁用初始化self.ref。然后,它是后值。以下代码引发AttributeError: 'Data' object has no attribute 'ref'

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__之后,我仍然收到错误消息。

解决方法

感谢@wim和@ juanpa.arrivillaga

删除__init__将解决问题,并使__post_init__重新运行。 (由wimjuanpa.arrivillaga指出)如果我写自己的__init__,为什么还要费心写__post_init__,也可以在其中编写所有我想要的后处理程序。 (订单顺序)

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所提供的功能不只是常规类。