从Python3.7开始,Python增加了dataclass类,它提供了对类属性数据的封装,和一些自动化的实现,极大的方便了用户的使用。dataclass类和namedtuple类有些像,但是比namedtuple功能更加强大,更加实用。
下面简单介绍一下dataclass类的优点
1 使用更少的代码构造一个类
当我们定义一个数据类时,常规的定义可能如下:
而使用dataclass类的定义可以精简如下,:
这里使用@dataclass修饰Student类,类中对每一个属性使用了类型标记,但类型标记不是必须的。
dataclass装饰类后不仅仅简化了代码,同时它也自动给类增加了__init__,__eq__,__repr__等方法,分别实现属性赋值,测试对象是否相等,表达类的字符串格式等,方便用户的使用。
2 支持默认值
这里在类型注释后对属性赋予了默认值,但需要注意的是没有默认值的属性必须放在有默认值属性前面不能放在他们后面,因此下面的代码是不正确的
3 定制化对象的字符串表达
这里使用print打印类对象自动输出了类的字符串表达,同时也可以重载__repr__方法定制自己的类字符串表达。
4 方便转换为tuple元组或者字典dict
使用astuple和asdict非常方便的将对象转化为元组和字典
5 设置对象只读
可以方便的创建一个只读的对象,只需要在修饰符中增加frozen=True
6 更方便的比较对象
传统的对比两个对象的值是否相等,需要重载__eq__方法,而使用dataclass类,自动实现了属性值的对比只需要直接对比就可以。
7 定制化属性值
一些情况下,类属性的值不是直接传入的,而是经过某种计算确定的这时使用
field(init=Flase,repr=False) 关键字说明这个属性在实例化类对象时不会初始化,而这种属性的初始化需要使用__post_init__函数进行初始化,如下面的例子:
8 更方便的对比对象、排序
一个有用的特性是你可以对对象进行大小比较和排序,通常的做法是在类内部重载__lt__小于,__le__ 小于等于,__gt__ 大于,__ge__大于等于函数。
使用dataclass类实现这个功能,更加的方便,在修饰符@dataclass中增加order=true,并使用sort_index关键字指定对比的属性即可,如下例子:
使用dataclass有如此多的好处,快一起试试吧