0%

python | @dataclass

参考资料

借助这个装饰器可以少写不少东西。

简单使用

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 对象。

请我喝杯咖啡吧~