简评:Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西,最激动人心的新功能之一是 dataclass 装饰器。

什么是 Data Class

大多数 Python 开发人员编写过很多像下面这样的类:

dataclass 可以为简单的情况自动生成方法,例如,一个init接受这些参数并将其分配给自己,之前的小例子可以重写为:

那么通过一个例子来看看如何使用吧

星球大战 API

可以使用 requests 从星球大战 API 获取资源:

让我们来看看 dictionary (简化过)的结果:

封装 API 为了正确地封装一个 API,我们应该创建一个用户可以在其应用程序中使用的对象,因此,在Python 3.6 中定义一个对象来包含requests对 /films/endpoint的响应:

class StarWarsMovie:

def init(self,

title: str,

episode_id: int,

opening_crawl: str,

director: str,

producer: str,

release_date: datetime,

characters: List[str],

planets: List[str],

starships: List[str],

vehicles: List[str],

species: List[str],

created: datetime,

edited: datetime,

url: str

):

self.title = title

self.episode_id = episode_id

self.opening_crawl= opening_crawl

self.director = director

self.producer = producer

self.release_date = release_date

self.characters = characters

self.planets = planets

self.starships = starships

self.vehicles = vehicles

self.species = species

self.created = created

self.edited = edited

self.url = url

if type(self.release_date) is str:

self.release_date = dateutil.parser.parse(self.release_date)

if type(self.created) is str:

self.created = dateutil.parser.parse(self.created)

if type(self.edited) is str:

self.edited = dateutil.parser.parse(self.edited)

仔细的读者可能已经注意到这里有一些重复的代码。

这是使用 dataclass 装饰器的经典案例,我们需要创建一个主要用来保存数据的类,只需一点验证,所以让我们来看看我们需要修改什么。

首先,data class 自动生成一些 dunder 方法,如果我们没有为 data class 装饰器指定任何选项,则生成的方法有:init,eq和repr,如果你已经定义了repr但没定义str,默认情况下 Python(不仅仅是 data class)将实现返回repr的输出str方法。因此,只需将代码更改为以下代码即可实现四种 dunder 方法:

我们去掉了init方法,以确保 data class 装饰器可以添加它生成的对应方法。不过,我们在这个过程中失去了一些功能,我们的 Python 3.6 构造函数不仅定义了所有的值,还试图解析日期,我们怎样才能用 data class 来做到这一点呢?

如果要覆盖 init,我们将失去 data class 的优势,因此,如果要处理任何附加功能可以使用新的 dunder 方法:postinit,让我们看看postinit方法对于我们的包装类来说是什么样子的:

就是这样! 我们可以使用 data class 装饰器在用三分之二的代码量实现我们的类。

更多好东西

通过使用装饰器的选项,可以为用例进一步定制 data class,默认选项是:

init决定是否生成init dunder 方法 repr决定是否生成repr dunder方法 eq对eq dunder 方法也是如此,它决定相等性检查的行为(yourclassinstance == another_instance) order 实际上创建了四种 dunder 方法,它们确定所有检查小于,and/or,大于的行为,如果将其设置为 true,则可以对对象列表进行排序。 最后两个选项确定对象是否可以被哈希化,如果你想使用你的 class 的对象作为字典键的话,这是必要的。

更多信息请参考:PEP 557 -- Data Classes

Python 3.7 将引入 dataclass 装饰器的更多相关文章

  1. Python之命名空间、闭包、装饰器

    一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...

  2. Python基础(七) python自带的三个装饰器

    说到装饰器,就不得不说python自带的三个装饰器: 1.@property   将某函数,做为属性使用 @property 修饰,就是将方法,变成一个属性来使用. class A(): @prope ...

  3. Python之面向对象:闭包和装饰器

    一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print na ...

  4. Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator

    一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...

  5. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  6. Python 变量作用域,闭包和装饰器

    from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...

  7. Python基础(闭包函数、装饰器、模块和包)

    闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()

  8. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  9. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

随机推荐

  1. 深入解剖unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...

  2. Centos7安装RocketMQ及配置测试

    环境 Centos7 RocketMQ 3.2.6 安装位置 /usr/local/alibaba-rockermq 外网ip 182.254.145.66 内网ip 10.105.23.114 安装 ...

  3. tomcat中Servlet的工作机制

    在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法 ...

  4. 剑指Offer——动态规划算法

    剑指Offer--动态规划算法 什么是动态规划? 和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解. 分治法是将问题划分成一些独立的子问题,递归地求解 ...

  5. Andriod Studio科普篇——3.关于gradle插件的常见问题

    1.andriod gradle插件版本过低. 出错位置: dependencies{ classpath 'com.android.tools.build:gradle:0.10.2' } 提示信息 ...

  6. Hessian源码分析--HessianServlet

    Hessian可以通过Servlet来对外暴露服务,HessianServlet继承于HttpServlet,但这仅仅是一个外壳,使用web服务器来提供对外的Http请求,在web.xml中我们会进行 ...

  7. ubuntu make menuconfig error

    主机环境:ubuntu -------------------------------------------------------------- 在ubuntu系统中,要编译内核,还需要安装一系列 ...

  8. React Native入门教程2 -- 基本组件使用及样式

    在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...

  9. 最近很多人问我:saiku下载不下来

    saiku的前段团队 在UI设计方面很专业.但是兼容性差到让人无语.不知道为什么,是不是不给钱,人家故意黑它. 一直忙别的工作,现在整理一些saiku相关网站,百度不到的,google又要FQ.看个合 ...

  10. Install and run DB Query Analyzer 6.04 on Microsoft Windows 10

          Install and run DB Query Analyzer 6.04 on Microsoft Windows 10  DB Query Analyzer is presented ...