简单说明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 相关文章推荐
Tornado Web服务器多进程启动的2个方法
Aug 04 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
python opencv 简单阈值算法的实现
Aug 04 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
python安装gdal的两种方法
Oct 29 Python
Python实现元素等待代码实例
Nov 11 Python
Python networkx包的实现
Feb 14 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
Python字符串格式化f-string多种功能实现
May 07 Python
浅析Python迭代器的高级用法
Jul 16 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实现的下载css文件中的图片的代码
2010/02/08 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
详解vue-cli + webpack 多页面实例配置优化方法
2017/07/13 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
vue.js实现三级菜单效果
2019/10/19 Javascript
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Django web框架使用url path name详解
2019/04/29 Python
flask 实现token机制的示例代码
2019/11/07 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
python开发一款翻译工具
2020/10/10 Python
使用HTML5 Canvas API控制字体的显示与渲染的方法
2016/03/24 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
如何写一个自定义标签
2012/12/28 面试题
班级道德讲堂实施方案
2014/02/24 职场文书
高中军训感言1000字
2014/03/01 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
保证书格式
2015/01/16 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP