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实现的金山快盘的签到程序
Jan 17 Python
Python中类的继承代码实例
Oct 28 Python
Python中super()函数简介及用法分享
Jul 11 Python
django1.8使用表单上传文件的实现方法
Nov 04 Python
Python实现的递归神经网络简单示例
Aug 11 Python
Python调用百度根据经纬度查询地址的示例代码
Jul 07 Python
python数据分析:关键字提取方式
Feb 24 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP5 安装方法
2007/01/15 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php可变长参数处理函数详解
2017/02/22 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
2019/06/22 PHP
jquery ajax abort()的使用方法
2010/10/28 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
微信小程序模板(template)使用详解
2018/01/31 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
网络教育自我鉴定
2013/11/01 职场文书
2014年后勤工作总结
2014/11/18 职场文书
鲁迅故里导游词
2015/02/05 职场文书
会议简报格式范文
2015/07/20 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
Vue2.0搭建脚手架
2022/03/13 Vue.js