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 05 Python
Python中断言Assertion的一些改进方案
Oct 27 Python
Python 爬虫之Beautiful Soup模块使用指南
Jul 05 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
tensorflow实现加载mnist数据集
Sep 08 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Python绘图实现显示中文
Dec 04 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
从python读取sql的实例方法
Jul 21 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 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
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
Yii2实现log输出到file及database的方法
2016/11/12 PHP
javascript innerHTML使用分析
2010/12/03 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
2016/12/08 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
canvas轨迹回放功能实现
2017/12/20 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
vue filter 完美时间日期格式的代码
2019/08/14 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
python入门之语句(if语句、while语句、for语句)
2015/01/19 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
什么是Python中的顺序表
2020/06/02 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
python 用struct模块解决黏包问题
2020/11/07 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
优秀经理事迹材料
2014/02/01 职场文书
请假条标准格式规范
2014/04/10 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
学生个人总结范文
2015/02/15 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
经典祝酒词大全
2015/08/12 职场文书
python 中的@运算符使用
2021/05/26 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL