前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >独家 | 9个可以显著优化代码的Python内置装饰器

独家 | 9个可以显著优化代码的Python内置装饰器

作者头像
数据派THU
发布2023-03-29 10:49:20
4580
发布2023-03-29 10:49:20
举报
文章被收录于专栏:数据派THU数据派THU
代码语言:javascript
复制
作者:Yang Zhou
翻译:陈之炎
校对:赵茹萱
本文约2000字,建议阅读8分钟本文介绍了精心挑选的9个函数装饰器,它将展示Python的优雅。

函数装饰器有事半功倍的力量。

Wallhaven 提供 图片

“简胜于繁。”

Python函数装饰器是“Python zen”哲学的最佳特性。

装饰器助力用更少、更简单的代码来实现复杂的逻辑,并在其他地方实现重用。

有许多很棒的内置Python装饰器使编码变得更为容易,只使用一行代码便可向当前的函数或类中添加复杂的函数。

行胜于言,接下来,来看看精心挑选的9个函数装饰器,它将展示Python的优雅。

1. @lru_cache:利用缓存提速程序

使用@lru_cache装饰器是提速Python函数最简易的方法。

此装饰器将函数的结果放入缓存,供后续具有相同参数的函数调用,无需再次执行具有相同参数的函数。

对于那些算力成本高昂或常用相同参数函数的调用特别有用。

来看看以下直观的示例:

上述程序用Python函数计算第n个Fibonacci数,这个函数非常耗时,当计算fibonacci(30)时,在递归过程中需要多次计算先前的Fibonacci数。

用@lru_cache装饰器来对它进行提速:

正如上述代码所示,使用@lru_cache装饰器后,可以在0.00002990秒内得到相同的结果,比先前的0.18129450秒快了不少。

@lru_cache装饰器有一个“最多结果数目”参数,该参数指定要在缓存中存储的最大结果数目。当缓存已满且需要存储新结果时,会将最近使用得最少的结果从缓存中删除,为新缓存腾出空间,称之为最近最不常用策略(LRU)。

默认情况下,将“最多结果数目”设为128。如果设为None,则禁用 LRU特性,缓存可以无约束地增长。

2. @total_ordering: 填充缺失排序方法的类装饰器

函数工具模块中的@total_sordeng装饰器为预定义Python类生成缺失比较方法。

下面为示例程序:

如上述代码所示,在学生类中没有对__ge__、__gt__和__le__方法进行定义,多亏有了@total_order装饰器,不同实例之间的比较结果均正确。

该装饰器的好处显而易见:

  • 可以使代码更干净,节省时间,因为无需编写全部比较方法。
  • 一些旧的类可能未充分定义比较方法,将@total_ordering装饰器添加到其中之后,后续的使用更加安全。

3. @contextmanager:定制的语境管理器

Python有一个语境管理器机制助力正确地管理资源。

大多数情况下,只需要使用with声明:

如上述代码所示,可以使用with语句打开文件,在写入之后将自动关闭。无需显式地调用f.close()函数来关闭该文件。

有时,需要为某些特定需求定义一个自定义的语境管理器,此时,@contextmanager装饰器便成为了我们的朋友。

例如,下述代码实现了一个简单的自定义语境管理器,它可以在文件打开或关闭时打印出相应的信息。

4. @property: 为Python类设置处理程序和设置程序

Getters和Setters是面向对象编程(OOP)中的重要概念。

对于类中的每个实例变量,getter方法返回其值,而setter方法设置或更新其值。鉴于此,Getters和Setters又分别称为Accessors和Mutators。

它们用于保护数据不会直接被意外访问或修改。

不同的OOP语言有不同的机制来定义获取器getters和setters。在Python中,可以简单地使用@property装饰器。

如上述示例所示,无法将分数变量设置为999,这是一个毫无意义的数字。因为@property装饰器的设置函数中限制了分数的可接受范围。

毫无疑问,添加这个setter可以成功地避免意外的错误和结果。

5. @cached_property:将方法的结果作为属性放入缓存

Python 3.8的函数工具模块引入了一个新的功能强大的装饰器-@cached_property,它将类的方法转换为一个属性,计算出该属性的值之后,将其作为实例的普通属性放入缓存。

下面是这个示例:

在上述代码中,利用@cached_property来装饰局部方法,无需重复计算circle.area示例。

6. @classmethod:定义新的Python类方法

Python类中有三种方法类型:

  • Instance methods(实例方法):绑定一个实例的方法,利用这种方法可以访问和修改实例数据。通过类的实例调用实例方法,通过self参数访问实例数据。
  • Class methods(类方法):绑定一个类的方法,无法利用该方法修改实例数据。是调用类自身的一种方法,它将类作为第一个参数,通常将其命名为cls。
  • Static methods(静态方法):不绑定实例或类的方法。

可以将实例方法定义成普通的Python函数,它的第一个参数是自身;如果需要定义一个类方法,则需要使用@classmethod装饰器。

为了演示,下面的示例定义了一个类方法,可以用它来根据直径获得一个圆:

7. @staticmethod:为Python类定义静态方法

如前所述,静态方法不绑定到实例或类,仅仅因为它们在逻辑上属于那个类,才被包含进来。

静态方法通常用于执行一组相关任务的实用程序类中,如数学计算。通过将相关函数组织成类的静态方法,使代码变得更加有组织、更容易理解。

使用@staticmethod装饰器便可以定义一个静态方法,来看看下面这个例子:

8. @dataclass:用更少的代码定义专用类

@dataclass装饰器(在Python3.7中引入)可以自动为一个类生成几种专用的方法,如__init__、__repr__、__eq__、__lt__等。

因此,它可以节省大量编写这些基本方法的时间。如果一个类主要用于存储数据,那么@dataccass装饰器是最好的朋友。

为了进行演示,下面的示例只定义了一个名为Point类的两个数据字段,@dataclass装饰器就够用了:

9. @atexit.register:注册一个程序正常终止的函数

atexit模块的@register装饰器允许在Python解释器退出时执行一个函数。

该装饰器对于执行最终的任务非常有用,比如释放资源或说“再会”!👋

下面是这个示例:

输出如下:

如示例所示,由于使用了@register装饰器,即使没有明确地调用“再会”函数,终端也打印出了“再会!”。

感谢拔冗阅读。❤️

原文标题:9 Python Built-In Decorators That Optimize Your Code Significantly

原文链接:https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017

编辑:黄继彦

校对:林亦霖

译者简介

陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. @lru_cache:利用缓存提速程序
  • 2. @total_ordering: 填充缺失排序方法的类装饰器
  • 3. @contextmanager:定制的语境管理器
  • 4. @property: 为Python类设置处理程序和设置程序
  • 5. @cached_property:将方法的结果作为属性放入缓存
  • 6. @classmethod:定义新的Python类方法
  • 7. @staticmethod:为Python类定义静态方法
  • 8. @dataclass:用更少的代码定义专用类
  • 9. @atexit.register:注册一个程序正常终止的函数
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档