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 相关文章推荐
python3库numpy数组属性的查看方法
Apr 17 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
Form表单及django的form表单的补充
Jul 25 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
python基础学习之递归函数知识总结
May 26 Python
如何理解及使用Python闭包
Jun 01 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正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
2019/05/09 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
Python程序设计入门(5)类的使用简介
2014/06/16 Python
Python模拟登陆实现代码
2017/06/14 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
Python如何实现线程间通信
2020/07/30 Python
微信小程序“圣诞帽”的实现思路详解
2017/12/28 HTML / CSS
德国拖鞋网站:German Slippers
2019/11/08 全球购物
一组SQL面试题
2016/02/15 面试题
小学教师的个人自我鉴定
2013/10/24 职场文书
表演方阵解说词
2014/02/08 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
上班离岗检讨书
2014/09/10 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
档案接收函格式
2015/01/30 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS