dataclasses.asdict()无法正常工作

时间:2019-06-14 09:51:17

标签: python inheritance python-3.7 python-dataclasses

我正在使用dataclasses中的dataclassasdict,发现asdict不能像我引入继承时所期望的那样工作。

我使用dataclasses帮助我从类中创建字典,以便将它们传递给django.shortcuts.render

from dataclasses import dataclass
from dataclasses import asdict

@dataclass
class Base:
    name: str

class Test(Base):
    def __init__(self, age, *args, **kwargs):
        self.age = age
        super(Test, self).__init__(*args, **kwargs)

test = Test(age=20, name="john doe")

print(asdict(test))

我希望输出为

{"age": 20, "name": "john doe"}

但是我得到的只是基类的关键字值

{"name": "john doe"}

1 个答案:

答案 0 :(得分:2)

in the docs涵盖了dataclass继承的正确实现:

@dataclass
class Base:
    name: str

@dataclass
class Child(Base):
    age: int

否则,__dataclass_fields__用来确定字典中应该包含的内容的子类中的asdict属性并不知道您关心的所有字段。它只有继承的版本:

>>> Test.__dataclass_fields__
{'name': Field(...)}
>>> Test.__dataclass_fields__ is Base.__dataclass_fields__
True
>>> Child.__dataclass_fields__
{'name': Field(...), 'age': Field(...)}
>>> Child.__dataclass_fields__ is Base.__dataclass_fields__
False

还请注意,您可以将导入简化为:

from dataclasses import asdict, dataclass