数据类的post_init方法中定义的变量可以序列化吗?

riv*_*ivu 5 python python-dataclasses

from dataclasses import dataclass
@dataclass
class A:
    x: str
    y: str
    def __post_init__(self):
        self.z = self.x+self.y
Run Code Online (Sandbox Code Playgroud)
a = A('abc', 'def')
a.z
'abcdef'
from dataclasses import asdict
asdict(a)
{'x': 'abc', 'y': 'def'}
Run Code Online (Sandbox Code Playgroud)

可以看出,z并没有被序列化。如何序列化它(除了调用__dict__它之外)?

aws*_*ice 5

您需要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'}
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看更多信息,如文档中所示。

这是因为在创建字典的过程中,该方法从对象的属性asdict中获取属性。__dataclass_fields__由于不是这些属性的一部分,因此在将对象转换为字典时z不会获取。z