我使用field(init= False)来禁用初始化self.ref。然后它就是post中的一个值。下面的代码引发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__后,我仍然收到错误。
发布于 2020-08-27 04:24:31
感谢@wim和@juanpa.arrivillaga
删除__init__可以解决问题,并让__post_init__再次运行。(正如wim和juanpa.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不会提供比常规类更多的东西。
https://stackoverflow.com/questions/63604630
复制相似问题