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中元祖、列表和字典的区别
Aug 17 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
python使用Flask操作mysql实现登录功能
May 14 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python+pyqt5实现24点小游戏
Jan 24 Python
Django 对象关系映射(ORM)源码详解
Aug 06 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
详解使用python爬取抖音app视频(appium可以操控手机)
Jan 26 Python
Python中zipfile压缩包模块的使用
May 14 Python
Python序列化模块JSON与Pickle
Jun 05 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
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
javascript add event remove event
2008/04/07 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
老生常谈ES6中的类
2017/07/31 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
基于JavaScript 实现拖放功能
2019/09/12 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
自学python用什么系统好
2020/06/23 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
python 发送get请求接口详解
2020/11/17 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
英国标准协会商店:BSI Shop
2019/02/25 全球购物
国际商务系学生个人的自我评价
2013/11/26 职场文书
西式结婚主持词
2014/03/14 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
反邪教观后感
2015/06/11 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server