Skip to main content
 首页 » 编程设计

python之dataclasses.asdict() 没有按预期工作

2024年08月13日40小虾米

我正在使用来自 dataclasses 的 dataclass 和 asdict ,我发现 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"} 

请您参考如下方法:

涵盖了数据类 继承的正确实现 in the docs :

@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