更多课程 选择中心


Python培训

400-111-8989

Python 3.7新功能之数据类的介绍


你有没有听到过python3.7预计在今年夏天发布,数数也就剩几个月的时间了,python3.7将会给我们带来什么新功能呢?有没有兴趣提前知道呢?我们一起来看一下吧:

温馨提示:如果你经常一个人在家用Pycharm撸代码,请确保将你的Pycharm升级到2018.1版本(等你读完本文再升级也来得及)。

Python3.7版本包含了众多新特性:比如对各种字符集的升级,推后了对注释的评价等等。其中最受期待的新特性当然是对数据类装饰器的支持。

什么是数据类

绝大多数的python开发者都写过许多类,比如下图这样的。

Python 3.7新功能之数据类的介绍

数据类可以自动地给你定义的实例生成“魔术”方法。例如:__init__可以接收参数,并把参数分配给self。上图中的小例子也可以这样写:

Python 3.7新功能之数据类的介绍

其中关键的不同点在于,数据类实际上是要求类型提示的。如果你以前从未用到过类型提示:类型提示允许你标记代码中某一个变量应该是哪种数据类型的。在运行时,变量的数据类型不会被检查,但你可以用Pycharm或者命令行工具比如mypy来静态的检查你的代码。

那么,让我们看看如何使用这个新特性。

星球大战API

你一定知道当一个电影粉丝用自己最爱的电影的数据创建了一个组REST API会让这个电影的粉丝团热情响应。一个星战粉丝就是这么干的,创建了星球大战API。实际上他做的更完善,直接为这个API创建了一个python库。

让我们暂时忘记这个包装库的存在,并探究一下如何创建我们自己的库。

我们可以用request库从星球大战API中获取资源。

Python 3.7新功能之数据类的介绍

这个终端(和所有终端一样)用JSON格式的信息进行响应。Request库还提供JSON解析。

Python 3.7新功能之数据类的介绍

此时我们把数据存入到了一个字典中,让我们来看一下。

Python 3.7新功能之数据类的介绍

封装这个API

为了正确封装这个API,我们应该创建一个让用户可以在自己的应用使用的对象。所以让我们用Python3.6定义一个对象来存放对/films/终端请求的响应。

Python 3.7新功能之数据类的介绍

细心的读者可能已经注意到了上面的代码有一些冗余,一般的话可以参考一下完整的Python3.6实现。

这是一个数据类装饰器帮你摆脱困境的经典案例。我们创建了一个用来保存数据,只进行少量验证的类。接下来一起看看有哪些地方需要修改。

首先,数据类自动的生成一些个魔术方法。如果我们没有指定任何数据类装饰器的选项,则自动生成的魔术方法为:__init__,__eq__,以及__repr__.如果你以及定义了__repr__,而不是__str__,那么python会默认地实现__str__以返回__repr__的输出结果。进而,你只要将代码如下图这样修改一下就得到了四种魔术方法:

Python 3.7新功能之数据类的介绍

在这里我们去掉了__init__方法来确保数据类装饰器可以添加它的子集。不幸的是在这一步中,我们还缺少了一个功能。我们的Python3.6构造函数不仅定义了所有的值,同时它还应该会尝试去解析数据。我们应该如何用数据类来实现这个功能呢?

如果我们重写__init__方法,那么就失去了用数据类的好处。因此,为了实现这些额外的处理,一个新的魔术方法__post_init__就诞生了。一起看下这个方法在我们要封装的对象中长什么样子:

Python 3.7新功能之数据类的介绍

大功告成,在数据类装饰器的帮助下,我们仅用了原先1/3行数的代码就实现了我们的类。

更多的好处

通过使用装饰器的选项,你可以进一步为自己的实例定制数据类。默认的选项是这样的:

Python 3.7新功能之数据类的介绍

init选项决定是否生成__init__方法。

repr选项决定是否生成__repr__方法。

eq选项同上,其中__eq__方法定义了检查是否相等的操作。

order选项实际上生成了四个用来定义检查大于、小于、and、or操作的魔术方法,设置此项为True,你就可以对对象进行排序。

最后的两个选项决定了你的对象是否能被哈希。这是非常必要的,比如在你想用类的对象作为字典键时。哈希函数应该在对象的生命周期内一直生效,否则存储数据的字典就再也找不到你的对象了。数据类中的__hash__函数将会默认地返回数据类中所有对象的哈希值。因此,只有在你设置对象为只读时(令frozen=True)才会默认地生成__hash__函数。

一旦使用frozen=True设置了只读属性,任何对你的对象进行写入的操作都会报错。如果你觉得这样太苛刻,并且还是想要确保对象永远不会被改变,那么可以设置unsafe_hash=True来代替frozen=True。数据类装饰器的开发者们不建议这样做。

恭喜你阅读完了本文《Python 3.7新功能之数据类的介绍》,通过本文你了解到了python3.7最令人兴奋的新功能,也了解了什么是数据类,数据类的好处是什么以及如何使用数据类等问题,如果你想更加深入地了解数据类,或者更多的python知识,欢迎到达内python培训机构进行咨询了解,或者参加我们的python培训班进行深入学习探讨!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:想要充分了解你的微信好友,用python呀!
下一篇:惊讶!用Python自动生成表情包

达内python培训机构就业喜报,用事实告诉你月薪过万不是梦!

python资讯|招聘AI人才开出4000万年薪,真的值吗?

你想自学python语言,因为它是黑客语言?

未来有两种人,会Python的和不懂Python的小学生?

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省