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的keyword模块用法实例分析
Jun 30 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
Python探索之SocketServer详解
Oct 28 Python
Python pandas常用函数详解
Feb 07 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
20行python代码实现人脸识别
May 05 Python
python3.7简单的爬虫实例详解
Jul 08 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
详解python tcp编程
Aug 24 Python
教你怎么用Python监控愉客行车程
Apr 29 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中实现图片的锐化
2006/10/09 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
Laravel 的数据库迁移的方法
2017/07/31 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python素数检测的方法
2015/05/11 Python
Python实现excel转sqlite的方法
2017/07/17 Python
Python探索之pLSA实现代码
2017/10/25 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
python关闭占用端口方式
2019/12/17 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
外贸实习生自荐信范文
2013/11/24 职场文书
学生生病请假条范文
2014/02/16 职场文书
商铺租赁意向书
2014/04/01 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
大学开学典礼新闻稿
2015/07/17 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript