简单说明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 29 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python制作爬虫采集小说
Oct 25 Python
python数据结构之列表和元组的详解
Sep 23 Python
selenium+python实现自动化登录的方法
Sep 04 Python
老生常谈python中的重载
Nov 11 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
Oct 17 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
Sep 21 Python
python 字典和列表嵌套用法详解
Jun 29 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 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中使用模板的方法
2008/05/24 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
layui实现给某一列加点击事件
2019/10/26 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python中的高级数据结构详解
2015/03/27 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
Python collections模块使用方法详解
2019/08/28 Python
python django中8000端口被占用的解决
2019/12/17 Python
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
美国购买隐形眼镜网站:Lenses For Less
2020/07/05 全球购物
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
商务英语应届生自我鉴定
2013/12/08 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
党员创先争优承诺书
2014/03/26 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server