1

python | @dataclass

 1 year ago
source link: https://benpaodewoniu.github.io/2022/12/12/python183/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

class A:
name = ""
age = 12

def __init__(self, name, age):
pass

正常来说,你创建一个 class 都需要自己写 init,这个比较麻烦,借助 @dataclass

from dataclasses import dataclass


@dataclass
class A:
name = ""
age = 12

@dataclass 相当于直接给你写好了 init

第一个例子是最常见的用法。

field

如果有一个属性是 list 的话。

@dataclass
class A:
names: List[str] = list

如果执行下面的代码

a = A()
a.names.append("123")
print(a)

则会报错。

但是,把上面的代码换成

from dataclasses import dataclass, field
from typing import List

@dataclass
class B:
names: List[str] = field(default_factory=list)

就正常了。

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 的结构如下

183_0.png

可以看到 name_A 并没有还原到 A 对象。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK