一文看懂Python的装饰器

在 Python 中使用装饰器,可以在不修改代码的前提下,为已有的函数添加新功能,例如打印日志、缓存数据等。

为什么需要装饰器

假如你要为某个函数添加新功能。直接的办法是,在该函数中实现这个功能,或者在新的函数中实现它,然后在该函数中调用新函数。

间接的办法是执行新的函数,新函数实现了该功能,并调用原来的函数。装饰器便是这样的函数。

既然直接的办法能解决问题,为什么还需用装饰器?

在实际中,随着业务的变化,项目会越来越复杂,比如:

类之间重复的代码越来越多。

项目代码包含大量与业务无关的功能,例如调试、缓存、鉴权等。

为了解决上述问题,第一个办法是把重复的代码和业务无关的功能抽象出来,然后在新的类中实现。这样一来,新类与旧类在项目中耦合,新类的改变会影响到旧类,项目的维护成本增加。

第二个思路是,在旧类需要的时候(编译或运行时)动态地加入这些功能,即面向切面编程。切面代表了一个功能点,站在业务的角度,它是与业务逻辑无关的功能。

面向对象的思想是把业务逻辑划分成不同的类,而面向切面为业务逻辑提供补充功能。前者是纵向切分,后者是横行切分。一纵一横,保持项目代码简洁。

装饰器实现的就是切面功能点。下文用一个例子说明三种类型点装饰器:普通装饰器、带参数的装饰器和装饰器类。

普通装饰器

我们即将实现一个计时器,它的功能是计算函数的运行时间。使用效果如下所示:

装饰器 的输入参数是一个函数对象,返回的结果也是一个函数对象。返回的函数是一个附加了新功能的函数。

在上面的例子中, 装饰器 实际上是一个执行如下操作的语法糖。

完整代码如下所示。

装饰后的函数名

在上述例子中,如果我们打印使用装饰器之后的函数 的名称,结果是 。

在一些情况下,我们希望保持原来函数的名称,这时可以利用Python自带的装饰器 来装饰 ,从而保持函数名称不变(代码如下)。

带参数的装饰器

下面我们要把计时器的功能稍微扩充一下。实现一个带参数的计时器,其中参数 代表了计时的单位:。

前面提到,装饰器函数的输入必须是一个函数对象。注意到函数名加括号 代表执行一个函数,因此只要让函数 的执行结果返回一个“普通的装饰器”即可。

装饰器类

我们还想给计时器增加新的计时单位 。直接的方法是在 函数中增加相应的逻辑。

但是,随着装饰器要实现的功能变得复杂,如果所有的逻辑在一个函数里实现,不利于协作和维护。这时可以用装饰器类,来实现对应的功能。

最后说一句:不要滥用装饰器。

(0)

相关推荐

  • 如何使用Python开发串口通讯上位机(完结)

    2021的第一份更新,比以往时候来得早一点! 前面两期讲了如何使用pyserial和做好了基本的上位机界面以及与API的联动,今天我们接着完善下代码. 1 编码规范的使用 前面两期只是做基础展示用,所 ...

  • 说说对于Python装饰器的理解?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • Numba是什么?如何使用?

    Numba,一款可以让Python函数编译为机器代码的JIT编译器,它可以加速Python运行,想必很多人对它都十分感兴趣,接下来我们就来看看吧. Numba是什么? Numba是一个库,可以在运行时 ...

  • 我应该学习MATLAB还是Python?

    让小编告诉你-.您应该学习什么MATLAB或Python 通过解释,Python是一种编程语言.最基本的实现是in(也称为Python)中的实现,通常被称为" Python".除了 ...

  • 一文看懂Python系列之装饰器(decorator)(工作面试必读)

    Python的装饰器(decorator)可以说是Python的一个神器,它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能.Python的装饰器同时也是Python学习从入门到精通过程中 ...

  • 一文看懂Python异常处理(exception, try和raise语句)

    一个Python程序在运行时,如果解释器遇到到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常(Exception).即便Python程序的语法是正确的,还是会有各种各样意想不到的异常或错 ...

  • 一文看懂Python系列文章 - 入门与进阶必备

    本文收集整理了本公众号已发表的一文看懂Python系列精华文章,建议先收藏后阅读. 入门篇 一文看懂Python列表.元组和字符串操作 一文看懂Python字典类型数据常见操作及排序 一文看懂Pyth ...

  • 一文看懂Python面向对象编程(Python学习与新手入门必看)-绝对原创

    尽管网上有许多关于Python面向对像的编程介绍,小编我看完后总觉得不是很满意,也不过瘾,所以决定自己亲自动手写篇文章,帮你理解Python面向对象的编程的基本概念和核心思想.本文内含很多实例代码,以 ...

  • 一文看懂Python中的集合运算&,|,

    关于集合的概念 Python 中常用的集合方法是执行标准的数学运算,例如:求并集.交集.差集以及对称差.下图显示了一些在集合 A 和集合 B 上进行的标准数学运算.每个韦恩(Venn)图中的红色部分是 ...

  • 【进阶】一文读懂Python装饰器,搞清来龙去脉!

    (给机器学习算法与Python学习加星标,提升AI技能) 选自pouannes.github.io 作者:Pierre Ouannes 本文由机器之心(nearhuman2014)翻译 原文:http ...

  • 一文搞懂Python装饰器

    一.前言 本不打算专门写文来讲装饰器的,但有不少粉丝问到了,自己查阅了一些网上的装饰器教程,发现讲的通俗易懂的不多,也有不少照搬的文章.所以我这里专门来讲一讲它. 个人在用的人工智能学习网站推荐给大家 ...

  • 一文看懂北朝瓷器,造型、釉色、装饰技法都各有特色

    北朝时期,河南.河北与山东地区积极吸纳南方瓷器烧造工艺,同时又融汇当地汉晋釉陶技术传统,在变革与创新中不仅成功烧制出了具有当地艺术特色的青釉.黑釉与褐釉瓷器,同时还发明了白釉瓷器. 根据考古资料表明, ...

  • 一文带你看懂Python数据分析利器——Pandas的前世今生

    来  源:Python大数据分析 作  者:朱卫军 本文将从Python生态.Pandas历史背景.Pandas核心语法.Pandas学习资源四个方面去聊一聊Pandas,期望能带给大家一点启发. P ...