简单说明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判断字符串与大小写转换
Jun 08 Python
详解Python字符串对象的实现
Dec 24 Python
python rsa 加密解密
Mar 20 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
火车票抢票python代码公开揭秘!
Mar 08 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
python多线程同步之文件读写控制
Feb 25 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
Python实现计算图像RGB均值方式
Jun 04 Python
python如何处理程序无法打开
Jun 16 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
python爬取豆瓣电影TOP250数据
May 23 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邮件专题
2006/10/09 PHP
PHP7.0安装笔记整理
2015/08/28 PHP
php实现将二维关联数组转换成字符串的方法详解
2017/07/31 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
简单的js表单验证函数
2013/10/28 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python列表推导式的使用方法
2013/11/21 Python
python算法学习之基数排序实例
2013/12/18 Python
python连接mysql调用存储过程示例
2014/03/05 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python Matplotlib库入门指南
2015/05/18 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
python与js主要区别点总结
2020/09/13 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
《晏子使楚》教学反思
2014/02/08 职场文书
岗位明星事迹材料
2014/05/18 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
漫改真人电影「萌系男友是燃燃的橘色」公开先导视觉图
2022/03/21 日漫