简单说明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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
Python实现方便使用的级联进度信息实例
May 05 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python hashlib模块用法实例分析
Jun 12 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
python多线程共享变量的使用和效率方法
Jul 16 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
python getpass实现密文实例详解
Sep 24 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
如何使用Python实现一个简易的ORM模型
May 12 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文件怎么打开 如何执行php文件
2011/12/21 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
php使用curl发送json格式数据实例
2013/12/17 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
python实现括号匹配的思路详解
2018/08/23 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
妇科医生自荐信
2013/11/05 职场文书
小学教育毕业生自荐信
2013/11/18 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
给校长的建议书
2014/03/12 职场文书
团队会宣传标语
2014/10/09 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python