https://www.python.org/dev/peps/pep-0557
有时候我们需要与一个给定的接口数据对象来交互一些固定结构的数据,为了比较优雅的进行储存,通常的办法是初始化一个数据类,像这样
class Player:
def **init**(self, name, number, position, age, grade):
[self.name](http://self.name/) = name
self.number = number
self.position = position
self.age = age
self.grade = grade
bryant = Player(name='Kobe Bryant', number=24, position='PG', age=22, grade='S')
jordan = Player('Micheal Jordan', 23, 'PG', 29, 'S+')
这种简单的数据类型一般没法给出对象描述(除非继续在class中实现__repr__
方法),也没法进行大小比较之类的。并且__init__
或多或少有些显得臃肿(需要的属性名出现了三遍)
实际上dataclass完整写出来是这样的
@dataclass(init=``**True**``, repr=``**True**``, eq=``**True**``, order=``**False**``, unsafe_hash=``**False**``, frozen=``**False**``)
这些参数的含义推荐去文档查
Basic
dataclass 可以认为是提供了一个简写__init__
方法的语法糖,类型注释是必填项 (不限制数据类型时, 添加typing.Any为类型注释),默认值的传递方式和__init__
方法的参数格式一致。
@dataclass
class Data:
name: Any
value: Any = 42
另外dataclass支持数据嵌套,并且会检查是否有可变默认参数并进行报错。
还有就是可以实现数据类不可变,只需要添加参数frozen=True
即可
@dataclass(frozen=True)
class Data:
name: Any
value: Any = 42
data = Data('myname', 99)
data.name = 'other'
>>>
FrozenInstanceError: cannot assign to field 'name'
[文章导入自 http://qzq-go.notion.site/37e426b7216b48fca67a4c608b4760e5 访问原文获取高清图片]