使用Python3.7 新特性dataclasss创建一个类

Python admin 2年前 (2019-06-08) 398次浏览 0个评论 扫描二维码

一、新旧代码对比

此代码以及本教程中的所有其他示例仅适用于 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


codeobj , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:使用Python3.7 新特性dataclasss创建一个类
喜欢 (0)
[a37free@163.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址