Python3.7新功能预览:数据类装饰器支持与字符集升级
Python Tribe(Python.freelycode.com)组织翻译,禁止重印,并欢迎转发。

Python 3.7有望在今年夏天发布,所以让我们看看它带来的新功能!如果您经常使用Pycharm单独在家编辑代码,请确保将Pycharm升级到2018.1版。 (在阅读本文后仍然是时候升级了)。
Python 3.7版本包含许多新功能:例如升级各种字符集,推迟评论评估等。最期待的新功能是对数据类装饰器的支持。
什么是数据类
大多数Python开发人员都写了许多课程,例如下图。
数据类可以为您定义的实例自动生成“魔术”方法。例如:__init__可以接收参数并将参数分配给自我。上图中的小例子也可以像这样写:
关键区别在于,数据类实际需要类型提示。如果您以前从未使用过类型提示:类型提示允许您标记代码中的某些变量的数据类型。在运行时,将不会检查变量的数据类型,但是您可以使用Pycharm或命令行工具(例如Mypy)来静态检查您的代码。
因此,让我们看看如何使用此新功能。
星球大战API
您必须知道,当电影迷使用您喜欢的电影中的数据创建一组REST API时,这将使这部电影的粉丝群体热情地做出回应。这就是《星球大战》粉丝创造的星球大战API所做的。实际上,他为此API做了更完美,直接创建了一个Python库。
让我们暂时忘记这个包装库的存在,并探索如何创建自己的图书馆。
我们可以使用请求库从星球大战API获取资源。
该终端(与所有终端一样)以JSON格式的信息做出响应。请求库还提供JSON解析。
目前,我们将数据存储到字典中,让我们看看。
封装此API
为了正确封装此API,我们应该创建一个对象,用户可以在自己的应用程序中使用该对象。因此,让我们使用Python 3.6定义一个对象,以存储对 /胶片 /终端请求的响应。
仔细的读者可能已经注意到上述代码具有一定的冗余。不太小心的读者可以参考完整的Python 3.6实现(这并不短)。
这是一个经典的情况,数据类装饰器可以帮助您摆脱麻烦。我们创建了一个拥有数据并仅执行少量验证的类。让我们看一下需要修改的内容。
首先,数据类自动生成一些魔术方法。如果我们没有为数据类装饰器指定任何选项,则自动生成的魔术方法为:__init__,__eq__和__repr__。如果定义__repr__,而不是__str__,则Python默认情况下将实现__str_________________________________________________。此外,您只需要修改代码,如下图所示,您将获得四种魔术方法:
在这里,我们删除了__init__方法,以确保数据类装饰器可以添加其子集。不幸的是,在此步骤中,我们缺少一个功能。我们的Python 3.6构造函数不仅定义了所有值,而且还应尝试解析数据。我们应该如何使用数据类实现此功能?
如果我们重写__init__方法,那么我们将失去使用数据类的好处。因此,为了实现这些额外的处理,新的魔法方法__post_init__诞生了。让我们看一下我们要封装的对象中此方法的样子:
任务完成了。在数据类装饰器的帮助下,我们仅使用原始代码数的1/3实施了类。