数据类:如何创建一个不需要初始化的自动生成的字段?
Dataclass: How do I create a field that does not need initializing which is automatically generated?
我使用 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__
,我仍然收到错误。
感谢@wim 和@juanpa.arrivillaga
删除 __init__
将解决问题并让 __post_init__
再次 运行。
(正如 wim
和 juanpa.arrivillaga
所指出的)如果我自己写 __init__
,为什么还要写 __post_init__
,我可以写所有 post 处理所有我想进去(行顺序)
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)
此外,我可能想重新考虑使用常规 class 重写它,因为这里使用 dataclass 只提供常规 class。
我使用 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__
,我仍然收到错误。
感谢@wim 和@juanpa.arrivillaga
删除 __init__
将解决问题并让 __post_init__
再次 运行。
(正如 wim
和 juanpa.arrivillaga
所指出的)如果我自己写 __init__
,为什么还要写 __post_init__
,我可以写所有 post 处理所有我想进去(行顺序)
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)
此外,我可能想重新考虑使用常规 class 重写它,因为这里使用 dataclass 只提供常规 class。