简单说明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操作mongodb根据_id查询数据的实现方法
May 20 Python
Python实现图像几何变换
Jul 06 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
替换python字典中的key值方法
Jul 06 Python
flask-restful使用总结
Dec 04 Python
Python函数和模块的使用总结
May 20 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
Mar 18 Python
django models里数据表插入数据id自增操作
Jul 15 Python
Flask处理Web表单的实现方法
Jan 31 Python
python 中[0]*2与0*2的区别说明
May 10 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
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
javascript获取指定区间范围随机数的方法
2017/09/08 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
js+html实现周岁年龄计算器
2019/06/25 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python简明入门教程
2015/08/04 Python
Python进程间通信Queue实例解析
2018/01/25 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
腾讯公司的一个sql题
2013/01/22 面试题
策划主管的工作职责
2013/11/24 职场文书
财务会计人员岗位职责
2013/11/30 职场文书
企划主管岗位职责
2013/12/12 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android