简单说明Python中的装饰器的用法


Posted in Python onApril 24, 2015

装饰器对与Python新手以至于熟悉Python的人都是一个难理解, 难写的东西. 那么今天就分享一下我对Python 装饰器的理解

所谓装饰器仅仅是一种语法糖, 可作用的对象可以是函数也可以是类, 装饰器本身是一个函数, 其主要工作方式就是将被装饰的类或者函数当作参数传递给装饰器函数, 比如定义如下装饰器

import time

def run_time(func):
  def wrapper(*args, **kwargs):
    start = time.time()
    r = func(*args, **kwargs)
    print time.time() - start
    return r
  return wrapper

我们用这个装饰器装饰一个test函数

@run_time
def test():
  print "just a test"

前面说过其实装饰器就是一个语法糖, 就是将被装饰的函数作为参数传递给装饰器函数, 所以上面可以展开为

test = run_time(test)

装饰器将在解释器运行一开始就被加载, 从而将被装饰的函数将被展开成如上方式, 因为 run_time装饰器返回wrapper函数, 所以当调用test函数时其实就是对wrapper的调用

如果你在Python shell下执行以上语句就会发现定义完test函数然后查看test时, shell所展示的是wrapper函数

简单说明Python中的装饰器的用法

接下来说说如何编写带参数的装饰器, 大家如果细心的话就可以发现其实带参数的装饰器是经过调用"装饰器"函数返回的一个装饰器, 之所以装饰器上打引号是说明其实这个所谓的"装饰器"只不过是一个普通的函数, 但这个普通的函数返回一个装饰器, 可以参看下面例子:

import time

def route(url):
  def decorator(func):
    func.__url__ = url
    return func
  return decorator

@route(r"/")
def index():
  return "Hi"

大家可以发现在使用route装饰器时我们其实是调用了route函数, route函数返回一个decorator装饰器, 因为我们不需要在装饰器内运行函数, 所以不需要一个wrapper函数来收集参数.

以上就是全部内容, 希望对装饰器一知半解的人有些许帮助

Python 相关文章推荐
python 判断自定义对象类型
Mar 21 Python
python双向链表实现实例代码
Nov 21 Python
Python制作数据导入导出工具
Jul 31 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
Python 中的Selenium异常处理实例代码
May 03 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
python之pexpect实现自动交互的例子
Jul 25 Python
python面向对象 反射原理解析
Aug 12 Python
python实现图像拼接
Mar 05 Python
tensorflow模型转ncnn的操作方式
May 25 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 #Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 #Python
解决Python中由于logging模块误用导致的内存泄露
Apr 23 #Python
粗略分析Python中的内存泄漏
Apr 23 #Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 #Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 #Python
在Python的Bottle框架中使用微信API的示例
Apr 23 #Python
You might like
PHP分页显示制作详细讲解
2008/11/19 PHP
php多文件上传下载示例分享
2014/02/20 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
超棒的响应式布局jQuery插件Freetile.js
2014/11/17 Javascript
JQuery中上下文选择器实现方法
2015/05/18 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
Bootstrap模态对话框的简单使用
2016/04/29 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
vuejs2.0实现一个简单的分页示例
2017/02/22 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
2019/12/10 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
python 捕获shell脚本的输出结果实例
2017/01/04 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
linux面试题参考答案(11)
2012/05/01 面试题
化学专业毕业生自荐信
2013/11/15 职场文书
护士求职推荐信范文
2013/11/23 职场文书
七年级音乐教学反思
2014/01/26 职场文书
李培根演讲稿
2014/05/22 职场文书
小学捐书活动总结
2014/07/05 职场文书
争先创优活动总结
2014/08/27 职场文书
高中家长意见怎么写
2015/06/03 职场文书