dataclasses的post_init方法中定义的变量可以序列化吗?
Can the variables defined in the post_init method of dataclasses be serialized?
from dataclasses import dataclass
@dataclass
class A:
x: str
y: str
def __post_init__(self):
self.z = self.x+self.y
a = A('abc', 'def')
a.z
'abcdef'
from dataclasses import asdict
asdict(a)
{'x': 'abc', 'y': 'def'}
可以看出,z
没有被序列化。如何序列化它(除了调用 __dict__
之外)?
您需要在首次定义 class 时将 z
作为变量包含在内,但此外您还需要使用 field
将其从 __init__
列表中省略参数。
from dataclasses import dataclass, field, asdict
@dataclass
class A:
x: str
y: str
z: str = field(init=False)
def __post_init__(self):
self.z = self.x + self.y
a = A("abc", "def")
a.z
>> 'abcdef'
asdict(a)
>> {'x': 'abc', 'y': 'def', 'z': 'abcdef'}
如文档中所示,您可以看到更多 here。
这是因为在创建字典的幕后,asdict
方法从对象的 __dataclass_fields__
属性中获取属性。由于 z
不是这些属性的一部分,因此在将对象转换为字典时不会获取 z
。
from dataclasses import dataclass
@dataclass
class A:
x: str
y: str
def __post_init__(self):
self.z = self.x+self.y
a = A('abc', 'def')
a.z
'abcdef'
from dataclasses import asdict
asdict(a)
{'x': 'abc', 'y': 'def'}
可以看出,z
没有被序列化。如何序列化它(除了调用 __dict__
之外)?
您需要在首次定义 class 时将 z
作为变量包含在内,但此外您还需要使用 field
将其从 __init__
列表中省略参数。
from dataclasses import dataclass, field, asdict
@dataclass
class A:
x: str
y: str
z: str = field(init=False)
def __post_init__(self):
self.z = self.x + self.y
a = A("abc", "def")
a.z
>> 'abcdef'
asdict(a)
>> {'x': 'abc', 'y': 'def', 'z': 'abcdef'}
如文档中所示,您可以看到更多 here。
这是因为在创建字典的幕后,asdict
方法从对象的 __dataclass_fields__
属性中获取属性。由于 z
不是这些属性的一部分,因此在将对象转换为字典时不会获取 z
。