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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
Python实现密码薄文件读写操作
Dec 16 Python
Python属性和内建属性实例解析
Jan 14 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
Mar 09 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
window.parent与window.openner区别介绍
2012/04/12 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
常用的JS验证和函数汇总
2014/12/23 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
jQuery.Ajax()的data参数类型详解
2017/07/23 jQuery
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
小程序自定义圆形进度条
2020/11/17 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
安装Python的教程-Windows
2017/07/22 Python
python 实现敏感词过滤的方法
2019/01/21 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
Django用户认证系统如何实现自定义
2020/11/12 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
经贸日语专业个人求职信范文
2013/12/28 职场文书
物流仓管员工作职责
2014/01/06 职场文书
525心理活动总结
2014/07/04 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
教师工作失职检讨书
2014/09/18 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
2014年财务科工作总结
2014/11/11 职场文书
关于幸福的感言
2015/08/03 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
九大龙王魂骨,山龙王留下躯干骨,榜首死的最憋屈(被捏碎)
2022/03/18 国漫