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 实现归并排序算法
Jun 05 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
利用Python破解验证码实例详解
Dec 08 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
Jun 11 Python
Python @property及getter setter原理详解
Mar 31 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 30 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
基于JQuery的一个简单的鼠标跟随提示效果
2010/09/23 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
vue小白入门教程
2018/04/02 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
Python比较2个时间大小的实现方法
2018/04/10 Python
使用python制作一个解压缩软件
2019/11/13 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
综合办公室主任职责
2013/12/16 职场文书
给客户的道歉信
2014/01/13 职场文书
区三好学生主要事迹
2014/01/30 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
伦敦奥运会口号
2014/06/13 职场文书
离婚财产处理协议书
2014/09/30 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
讲解Python实例练习逆序输出字符串
2022/05/06 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle