简单说明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抓取京东价格分析京东商品价格走势
Jan 09 Python
编写Python小程序来统计测试脚本的关键字
Mar 12 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
pandas 数据实现行间计算的方法
Jun 08 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 Python
python验证码图片处理(二值化)
Nov 01 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
django rest framework 过滤时间操作
Jul 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
Classes and Objects in PHP5-面向对象编程 [1]
2006/10/09 PHP
php缓存技术介绍
2006/11/25 PHP
详解PHP显示MySQL数据的三种方法
2008/06/05 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
2018/04/18 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
layui table去掉右侧滑动条的实现方法
2019/09/05 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
详解React中共享组件逻辑的三种方式
2021/02/02 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
Python3基础之条件与循环控制实例解析
2014/08/13 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
python类中super() 的使用解析
2019/12/19 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
2014年前台文员工作总结
2014/12/08 职场文书
音乐会主持人开场白
2015/05/28 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
对Keras自带Loss Function的深入研究
2021/05/25 Python