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之变量和参数
Oct 10 Python
Python标准库之Sys模块使用详解
May 23 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
使用Python写一个小游戏
Apr 02 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Django 自定义分页器的实现代码
Nov 24 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
Python新手学习函数默认参数设置
Jun 03 Python
python中常用的数据结构介绍
Jan 12 Python
教你怎么用python selenium实现自动化测试
May 27 Python
python b站视频下载的五种版本
May 27 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 开发环境配置(Zend Server安装)
2010/04/28 PHP
深入php多态的实现详解
2013/06/09 PHP
PHP判断一个gif图片是否为动态图片的方法
2014/11/19 PHP
ThinkPHP实现支付宝接口功能实例
2014/12/02 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PDO的安全处理与事物处理方法
2016/10/31 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
2017/02/23 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
Python实现建立SSH连接的方法
2015/06/03 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
财务总经理岗位职责
2014/02/16 职场文书
库房管理员岗位职责
2014/03/09 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
工程项目经理任命书
2014/06/05 职场文书
环保标语口号
2014/06/13 职场文书
结对共建协议书
2014/08/20 职场文书
四风问题查摆材料
2014/08/25 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python