资讯专栏INFORMATION COLUMN

Python 3.7 将引入 dataclass 装饰器

leanote / 2679人阅读

摘要:简评将于今年夏天发布,中将会有许多新东西,最激动人心的新功能之一是装饰器。因此,只需将代码更改为以下代码即可实现四种方法我们去掉了方法,以确保装饰器可以添加它生成的对应方法。

简评: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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41654.html

相关文章

  • Python 面向对象编程OOP (五) 写类神Dataclass

    摘要:大家好,上一期受到了朋友的启发,这一期我主要记录一下我的的学习过程。 Dataclasses 大家好,上一期受到了朋友的启发,这一期我主要记录一下我的Dataclasses的学习过程。 之前简单回顾了attrs的用法,这一期来看更简洁的自带写类神器:dataclasses,需要注意,版本要大于等于Python 3.7 官方文档链接: Data Classes下面直接来看例子: 创建Da...

    elarity 评论0 收藏0
  • Python 2.7终结于7个月后,这是你需要了解的3.X炫酷新特性

    摘要:截止到月号上午点,将终结于在这一段时间中,很多优秀开源项目与库已经停止了对的支持。除了,还提供了一种通过进行字符串插入的灵活方法。扩展的可迭代对象解包最低版本为对于这个特性,代码就说明了一切。从 3.0 到 3.8,Python 3 已经更新了一波又一波,但似乎我们用起来和 2.7 没有太大区别?以前该怎么写 2.7 的代码现在就怎么写,只不过少数表达方式变了而已。在这篇文章中,作者介绍了 ...

    番茄西红柿 评论0 收藏0
  • Python 2.7终结于7个月后,这是你需要了解的3.X炫酷新特性

    摘要:截止到月号上午点,将终结于在这一段时间中,很多优秀开源项目与库已经停止了对的支持。除了,还提供了一种通过进行字符串插入的灵活方法。扩展的可迭代对象解包最低版本为对于这个特性,代码就说明了一切。从 3.0 到 3.8,Python 3 已经更新了一波又一波,但似乎我们用起来和 2.7 没有太大区别?以前该怎么写 2.7 的代码现在就怎么写,只不过少数表达方式变了而已。在这篇文章中,作者介绍了 ...

    chadLi 评论0 收藏0
  • python基础教程:异步IO 之 概念和历史

    摘要:并发的方式有多种,多线程,多进程,异步等。多线程和多进程之间的场景切换和通讯代价很高,不适合密集型的场景关于多线程和多进程的特点已经超出本文讨论的范畴,有兴趣的同学可以自行搜索深入理解。 编程中,我们经常会遇到并发这个概念,目的是让软件能充分利用硬件资源,提高性能。并发的方式有多种,多线程,多进程,异步IO等。多线程和多进程更多应用于CPU密集型的场景,比如科学计算的时间都耗费在CPU...

    BicycleWarrior 评论0 收藏0
  • python 多个装饰的调用顺序

    摘要:如果不使用装饰器的话,普通的做法可能是在中写一堆校验代码来判断用户是否登录,然后决定后面的执行逻辑,这样比较麻烦。 前言 装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的地方有很多,简单的举例如以下场景 引入日志 函数执行时间统计 执...

    wapeyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<