加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python 装饰器

发布时间:2020-12-17 00:24:47 所属栏目:Python 来源:网络整理
导读:首先 需求来了 有如下几个封装好的函数供调用: 现在需要在每个函数执行前进行日志记录: 第一个方案 修改每个函数,添加日志记录的代码 但这样显然不太好,存在大量的重复代码,可以将重复代码封装为一个方法 第二个方案 这样的确是比第一个方案好多了,但是不符

首先

Python 装饰器

Python 装饰器

需求来了

有如下几个封装好的函数供调用:

Python 装饰器

现在需要在每个函数执行前进行日志记录:

第一个方案

Python 装饰器

修改每个函数,添加日志记录的代码

但这样显然不太好,存在大量的重复代码,可以将重复代码封装为一个方法

第二个方案

Python 装饰器

这样的确是比第一个方案好多了,但是不符合开闭原则,即现有的代码不要去修改,而在基础的功能上进行二次开发

第三个方案

Python 装饰器

这样的确很好,但是在调用的时候太麻烦了,而且函数名字也变了,以前写好的代码全部都要修改,想办法让函数名不变就好了

第四个方案

Python 装饰器

这样就又好点了,在增加功能而不修改代码的前提下,也保证了函数名不变

这就是装饰器的功能了,装饰器和上边的代码实现的功能相同,只不过用了语法糖

使用装饰器的方案

Python 装饰器

装饰器原理

上述代码在执行@verify时,进行了如下操作:

执行verify函数 ,并将 @verify 下面的函数作为verify函数的参数

即@verify 等价于 verify(f1),其内部执行代码如下:

f1 = verify(f1)

如此便为装饰器

小小装饰器

Python 装饰器

输出结果:

Python 装饰器

装饰器的常用功能

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备处理
  4. 执行函数后清理功能
  5. 权限校验等场景
  6. 缓存

装饰器实例

1.无参数的函数

Python 装饰器

2.被装饰的函数有参数

Python 装饰器

3.被装饰的函数有不定长参数

Python 装饰器

4.装饰器中的return

Python 装饰器

执行结果

Python 装饰器

如果修改装饰器为 return func(),则运行结果:

Python 装饰器

所以,一般情况下为了让装饰器更通用,可以有return

5.装饰器带参数,在原有装饰器的基础上,设置外部变量

Python 装饰器

运行结果为:

Python 装饰器

可以理解为:

foo()==timefun_arg("itcast")(foo)()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读