【发布时间】:2020-08-26 19:37:08
【问题描述】:
我使用 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__ to __post_init__,我仍然收到错误。
【问题讨论】:
-
非常正确。感谢您发现它。
-
我进行了更正,但仍然遇到同样的错误。 post 中的 print-statement 仍未执行。
-
嗯,但你从来没有叫过它。通常自动生成的
__init__调用 post init 钩子,但既然你自己写了__init__,现在就看你自己了.. -
老实说,如果您要编写
__init__,为什么还要创建一个数据类?它不接受任何与属性相对应的参数? -
@wim 好的,我想我明白了。如果
__init__不是自动生成的,__post__init__是多余的。并且没有被调用。那么,所有进程都在 init 中吗?删除__post_init__?
标签: python python-3.x python-dataclasses