简单说明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获得图片base64编码示例
Jan 16 Python
python读取html中指定元素生成excle文件示例
Apr 03 Python
python判断字符串是否包含子字符串的方法
Mar 24 Python
python threading模块操作多线程介绍
Apr 08 Python
python中的数据结构比较
May 13 Python
python flask解析json数据不完整的解决方法
May 26 Python
pyqt5 使用label控件实时显示时间的实例
Jun 14 Python
Python使用贪婪算法解决问题
Oct 22 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
python退出循环的方法
Jun 18 Python
Python中for后接else的语法使用
May 18 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
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
文件编码导致jquery失效的解决方法
2013/06/26 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
浅谈Django的缓存机制
2018/08/23 Python
python3实现点餐系统
2019/01/24 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python多线程分块读取文件
2019/08/29 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
2020/09/01 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
试述DBMS的主要功能
2016/11/13 面试题
就业推荐自我鉴定
2013/10/06 职场文书
舞蹈毕业生的自我评价
2014/03/05 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
销售代理协议书
2014/09/30 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
换届选举主持词
2015/07/03 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
Java基础之this关键字的使用
2021/06/30 Java/Android