Ken*_*tin 4 python inheritance python-3.7 python-dataclasses
我正在使用dataclassand asdictfrom dataclasses,我发现这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))
Run Code Online (Sandbox Code Playgroud)
我希望输出是
{"age": 20, "name": "john doe"}
Run Code Online (Sandbox Code Playgroud)
但我得到的只是来自基类的关键字值
{"name": "john doe"}
Run Code Online (Sandbox Code Playgroud)
文档中dataclass介绍了继承 a 的正确实现:
@dataclass
class Base:
name: str
@dataclass
class Child(Base):
age: int
Run Code Online (Sandbox Code Playgroud)
没有这个,__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
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以将导入简化为:
from dataclasses import asdict, dataclass
Run Code Online (Sandbox Code Playgroud)