简单说明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 11 Python
Python3.6笔记之将程序运行结果输出到文件的方法
Apr 22 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
Jun 13 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
对python Tkinter Text的用法详解
Oct 11 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
Python读取stdin方法实例
May 24 Python
python实现连连看辅助(图像识别)
Mar 25 Python
python中的Elasticsearch操作汇总
Oct 30 Python
python已协程方式处理任务实现过程
Dec 27 Python
python对XML文件的操作实现代码
Mar 27 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 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中获取url与物理路径的总结
2013/06/21 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
深入浅析JavaScript的API设计原则
2016/06/14 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
关于RxJS Subject的学习笔记
2018/12/05 Javascript
微信小程序3D轮播实现代码
2019/09/19 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
python基础教程之缩进介绍
2014/08/29 Python
跟老齐学Python之网站的结构
2014/10/24 Python
快速入门python学习笔记
2017/12/06 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
解决python运行启动报错问题
2020/06/01 Python
django使用多个数据库的方法实例
2021/03/04 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
求职自荐信的格式
2014/04/07 职场文书
节约用电标语
2014/06/17 职场文书
建筑安全责任书范本
2014/07/24 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
实例详解Python的进程,线程和协程
2022/03/13 Python