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访问纯真IP数据库的代码
May 19 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
python处理图片之PIL模块简单使用方法
May 11 Python
python实现矩阵乘法的方法
Jun 28 Python
使用Python编写基于DHT协议的BT资源爬虫
Mar 19 Python
Python获取当前路径实现代码
May 08 Python
pytorch自定义初始化权重的方法
Aug 17 Python
numpy求平均值的维度设定的例子
Aug 24 Python
python db类用法说明
Jul 07 Python
python爬虫用mongodb的理由
Jul 28 Python
Python try except else使用详解
Jan 12 Python
python自动化测试之Selenium详解
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 数组的指针操作实现代码
2011/02/08 PHP
php 注释规范
2012/03/29 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
详解React之父子组件传递和其它一些要点
2018/06/25 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
python生成指定长度的随机数密码
2014/01/23 Python
Python协程的用法和例子详解
2017/09/09 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
详解Python 中的容器 collections
2020/08/17 Python
法定代表人授权委托书
2014/04/04 职场文书
平安建设工作方案
2014/06/02 职场文书
节能环保演讲稿
2014/08/28 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
化工见习报告范文
2014/10/31 职场文书
2019教师的学习计划
2019/06/25 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
用Python提取PDF表格的方法
2021/04/11 Python