简单说明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绘制人人网好友关系图示例
Apr 01 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
Python中字典的基础知识归纳小结
Aug 19 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
python的json中方法及jsonpath模块用法分析
Dec 06 Python
Python SSL证书验证问题解决方案
Jan 13 Python
python扫描线填充算法详解
Feb 19 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
numpy库reshape用法详解
Apr 19 Python
Python 如何创建一个线程池
Jul 28 Python
用Python编写简单的gRPC服务的详细过程
Jul 04 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页面中文乱码分析
2013/10/29 PHP
php验证session无效的解决方法
2014/11/04 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
jQuery对象和Javascript对象之间转换的实例代码
2013/03/20 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
2019/01/30 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
python多线程用法实例详解
2015/01/15 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python编程argparse入门浅析
2018/02/07 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
旅行社各个岗位职责
2014/03/15 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
毕业生爱心捐书倡议书
2015/04/27 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
社区服务活动感想
2015/08/11 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js