作者:Yang Zhou
翻译:陈之炎
校对:赵茹萱
本文约2000字,建议阅读8分钟本文介绍了精心挑选的9个函数装饰器,它将展示Python的优雅。
函数装饰器有事半功倍的力量。
Wallhaven 提供 图片
“简胜于繁。”
Python函数装饰器是“Python zen”哲学的最佳特性。
装饰器助力用更少、更简单的代码来实现复杂的逻辑,并在其他地方实现重用。
有许多很棒的内置Python装饰器使编码变得更为容易,只使用一行代码便可向当前的函数或类中添加复杂的函数。
行胜于言,接下来,来看看精心挑选的9个函数装饰器,它将展示Python的优雅。
使用@lru_cache装饰器是提速Python函数最简易的方法。
此装饰器将函数的结果放入缓存,供后续具有相同参数的函数调用,无需再次执行具有相同参数的函数。
对于那些算力成本高昂或常用相同参数函数的调用特别有用。
来看看以下直观的示例:
上述程序用Python函数计算第n个Fibonacci数,这个函数非常耗时,当计算fibonacci(30)时,在递归过程中需要多次计算先前的Fibonacci数。
用@lru_cache装饰器来对它进行提速:
正如上述代码所示,使用@lru_cache装饰器后,可以在0.00002990秒内得到相同的结果,比先前的0.18129450秒快了不少。
@lru_cache装饰器有一个“最多结果数目”参数,该参数指定要在缓存中存储的最大结果数目。当缓存已满且需要存储新结果时,会将最近使用得最少的结果从缓存中删除,为新缓存腾出空间,称之为最近最不常用策略(LRU)。
默认情况下,将“最多结果数目”设为128。如果设为None,则禁用 LRU特性,缓存可以无约束地增长。
函数工具模块中的@total_sordeng装饰器为预定义Python类生成缺失比较方法。
下面为示例程序:
如上述代码所示,在学生类中没有对__ge__、__gt__和__le__方法进行定义,多亏有了@total_order装饰器,不同实例之间的比较结果均正确。
该装饰器的好处显而易见:
Python有一个语境管理器机制助力正确地管理资源。
大多数情况下,只需要使用with声明:
如上述代码所示,可以使用with语句打开文件,在写入之后将自动关闭。无需显式地调用f.close()函数来关闭该文件。
有时,需要为某些特定需求定义一个自定义的语境管理器,此时,@contextmanager装饰器便成为了我们的朋友。
例如,下述代码实现了一个简单的自定义语境管理器,它可以在文件打开或关闭时打印出相应的信息。
Getters和Setters是面向对象编程(OOP)中的重要概念。
对于类中的每个实例变量,getter方法返回其值,而setter方法设置或更新其值。鉴于此,Getters和Setters又分别称为Accessors和Mutators。
它们用于保护数据不会直接被意外访问或修改。
不同的OOP语言有不同的机制来定义获取器getters和setters。在Python中,可以简单地使用@property装饰器。
如上述示例所示,无法将分数变量设置为999,这是一个毫无意义的数字。因为@property装饰器的设置函数中限制了分数的可接受范围。
毫无疑问,添加这个setter可以成功地避免意外的错误和结果。
Python 3.8的函数工具模块引入了一个新的功能强大的装饰器-@cached_property,它将类的方法转换为一个属性,计算出该属性的值之后,将其作为实例的普通属性放入缓存。
下面是这个示例:
在上述代码中,利用@cached_property来装饰局部方法,无需重复计算circle.area示例。
Python类中有三种方法类型:
可以将实例方法定义成普通的Python函数,它的第一个参数是自身;如果需要定义一个类方法,则需要使用@classmethod装饰器。
为了演示,下面的示例定义了一个类方法,可以用它来根据直径获得一个圆:
如前所述,静态方法不绑定到实例或类,仅仅因为它们在逻辑上属于那个类,才被包含进来。
静态方法通常用于执行一组相关任务的实用程序类中,如数学计算。通过将相关函数组织成类的静态方法,使代码变得更加有组织、更容易理解。
使用@staticmethod装饰器便可以定义一个静态方法,来看看下面这个例子:
@dataclass装饰器(在Python3.7中引入)可以自动为一个类生成几种专用的方法,如__init__、__repr__、__eq__、__lt__等。
因此,它可以节省大量编写这些基本方法的时间。如果一个类主要用于存储数据,那么@dataccass装饰器是最好的朋友。
为了进行演示,下面的示例只定义了一个名为Point类的两个数据字段,@dataclass装饰器就够用了:
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】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。
点击“阅读原文”拥抱组织