参考资料
借助这个装饰器可以少写不少东西。
简单使用
1 2 3 4 5 6
| class A: name = "" age = 12
def __init__(self, name, age): pass
|
正常来说,你创建一个 class
都需要自己写 init
,这个比较麻烦,借助 @dataclass
1 2 3 4 5 6 7
| from dataclasses import dataclass
@dataclass class A: name = "" age = 12
|
@dataclass
相当于直接给你写好了 init
。
第一个例子是最常见的用法。
field
如果有一个属性是 list
的话。
1 2 3
| @dataclass class A: names: List[str] = list
|
如果执行下面的代码
1 2 3
| a = A() a.names.append("123") print(a)
|
则会报错。
但是,把上面的代码换成
1 2 3 4 5 6
| from dataclasses import dataclass, field from typing import List
@dataclass class B: names: List[str] = field(default_factory=list)
|
就正常了。
字典转译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from dataclasses import dataclass, field from typing import List
@dataclass class A: names: List[str] = list
@dataclass class B(A): name: str = "" name_A: A = field(default_factory=A) names: List[str] = field(default_factory=list)
if __name__ == '__main__': t = { "name": "1", "name_A": { "names": ["5", "6"] }, "names": ["2", "3"] } b = B(**(t)) print(b)
|
b
的结构如下
可以看到 name_A
并没有还原到 A
对象。