一、新旧代码对比
此代码以及本教程中的所有其他示例仅适用于 Python 3.7 及更高版本。
注意:
当然在 Python 3.6 版本也可以使用这个功能,不过需要安装 dataclasses 这个库,
使用 pip install dataclasses 命令就可以轻松安装,
Github地址: dataclass (在 Python 3.7 版本中 dataclasses 已经作为一个标准库存在了)
1、在旧版本中创建一个类
class MyData:
def __init__(self, name, age):
self.name = name
self.age = age
可以看出基本的普通类,每个属性需要写三次,而且没有备注也很暗看出是什么类型
>>> my = MyData('zhangsan', 10)
>>> my.name
'zhangsan'
>>> my
<__main__.MyData object at 0x8fc6tee35f30>
>>> my == MyData('zhangsan', 10)
False
如此看来,每次调用MyData都相当于重新创建了一个MyData对象
2、使用dataclass装饰器创建一个类
from dataclasses import dataclass
@dataclass
class MyData:
name: str
age: int
>>> my = MyData('zhangsan', 10)
>>> my.name
'zhangsan'
>>> my
MyData(name='zhangsan', age=10)
>>> my == MyData('zhangsan', 10)
True
可以看出,如果属性值相同,则是对原数据的一次调用而不是新创建一个对象
二、使用其他的方案创建类似的dataclass
1、使用from collections import namedtuple
from collections import namedtuple
MyData = namedtuple('MyData', ['name', 'age'])
>>> my = MyData('zhangsan', 10)
>>> my.name
'zhangsan'
>>> my
MyData(name='zhangsan', age=10)
>>> my == MyData('zhangsan', 10)
True
namedtuple 是一个普通的元组。这一点可以从如下代码的比较中看出:
>>> my == ('zhangsan', 10)
True
看起来我们应该是使用namedtuple更简单,但是如果使用namedtuple会造成两个不同的namedtuple相等
# namedtuple没有属性限定
>>> Person = namedtuple('Person', ['a', 'b']
>>> test = MyData('A', 'Spades')
>>> test == Person('A', 'Spades')
True
两个不同的对象相等了,所以我们通常不使用namedtuple进行对象对比
并且由于是元组是不能进行修改的
>>> card = MyData('7', 'Diamonds')
>>> card.name = '9'
AttributeError: can't set attribute
2、 添加默认值
向 dataclass 类的字段添加默认值很容易:
from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
本文内容来自:https://mp.weixin.qq.com/s/husFAjeR4Nh7qjEwMVuqtQ