python中的decorator的作用详解


Posted in Python onJuly 26, 2018

1、概念

装饰器(decorator)就是:定义了一个函数,想在运行时动态增加功能,又不想改动函数本身的代码。可以起到复用代码的功能,避免每个函数重复性编写代码,简言之就是拓展原来函数功能的一种函数。在python中,装饰器(decorator)分为 函数装饰器 和 类装饰器 两种。python中内置的@语言就是为了简化装饰器调用。

列出几个装饰器函数:

打印日志:@log

检测性能:@performance

数据库事务:@transaction

URL路由:@post('/register')

2、使用方法

(1)无参数decorator

编写一个@performance,它可以打印出函数调用的时间。

import time

def performance(f):
 def log_time(x):
  t1 = time.time()
  res = f(x)
  t2 = time.time()
  print 'call %s() in %fs' %(f.__name__,(t2 - t1))
  return res
 return log_time

@performance
def factorial(n):
 return reduce(lambda x,y : x*y,range(1,n+1))

print factorial(10)

运行结果:

call factorial() in 0.006009s 2 3628800

运行原理:

此时,factorial就作为performance的函数对象,传递给f。当调用factorial(10)的时候也就是调用log_time(10)函数,而在log_time函数内部,又调用了f,这就造成了装饰器的效果。说明f是被装饰函数,而x是被装饰函数的参数。

(2)带参数decorator

请给 @performace 增加一个参数,允许传入's'或'ms'。

import time

def performance(unit):
 def perf_decorator(f):
  def wrapper(*args, **kw):
   t1 = time.time()
   r = f(*args, **kw)
   t2 = time.time()
   t = (t2 - t1)*1000 if unit =='ms' else (t2 - t1)
   print 'call %s() in %f %s'%(f.__name__, t, unit)
   return r
  return wrapper
 return perf_decorator

@performance('ms') 
def factorial(n):
 return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

运行结果:

call factorial() in 9.381056 ms 2 3628800

运行原理:

它的内部逻辑为factorial=performance('ms')(factorial);

这里面performance('ms')返回是perf_decorator函数对象,performance('ms')(factorial)其实就是perf_decorator(factorial),然后其余的就和上面是一样的道理了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python笔记(叁)继续学习
Oct 24 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
Python NumPy库安装使用笔记
May 18 Python
Python中的rjust()方法使用详解
May 19 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
Python实现删除时保留特定文件夹和文件的示例
Apr 27 Python
python实现PID算法及测试的例子
Aug 08 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python-jenkins 获取job构建信息方式
May 12 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
Pycharm快捷键配置详细整理
Oct 13 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 Python
python opencv实现旋转矩形框裁减功能
Jul 25 #Python
Python3匿名函数用法示例
Jul 25 #Python
Python实现动态添加属性和方法操作示例
Jul 25 #Python
利用pandas读取中文数据集的方法
Jul 25 #Python
利用pandas进行大文件计数处理的方法
Jul 25 #Python
使用python验证代理ip是否可用的实现方法
Jul 25 #Python
Python+Pandas 获取数据库并加入DataFrame的实例
Jul 25 #Python
You might like
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
十大使用PHP框架的理由
2015/09/26 PHP
Yii2实现上下联动下拉框功能的方法
2016/08/10 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
Angular开发者指南之入门介绍
2017/03/05 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[05:09]第二届DOTA2亚洲邀请赛决赛日比赛集锦:iG 3:0 OG夺冠
2017/04/05 DOTA
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
临床医学大学生求职信
2013/09/28 职场文书
如何做好总经理助理
2013/11/12 职场文书
优秀求职自荐信怎样写
2013/12/18 职场文书
教学质量评估实施方案
2014/03/17 职场文书
关爱老人标语
2014/06/21 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
九九重阳节致辞
2015/07/31 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
Python打包为exe详细教程
2021/05/18 Python
SQL实现LeetCode(178.分数排行)
2021/08/04 MySQL