简单说明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中条件判断语句的简单使用方法
Aug 21 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
Python 的内置字符串方法小结
Mar 15 Python
详解Python中的Descriptor描述符类
Jun 14 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
python基础之入门必看操作
Jul 26 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
对Python中的@classmethod用法详解
Apr 21 Python
python字符串string的内置方法实例详解
May 14 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
Python安装及Pycharm安装使用教程图解
Sep 20 Python
Django migrate报错的解决方案
May 20 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
javascript demo 基本技巧
2009/12/18 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
js module大战
2019/04/19 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
Python字符串格式化
2015/06/15 Python
Python协程的用法和例子详解
2017/09/09 Python
十分钟利用Python制作属于你自己的个性logo
2018/05/07 Python
python实现机器学习之多元线性回归
2018/09/06 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
项目计划书范文
2014/01/09 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
白银帝国观后感
2015/06/17 职场文书
小学秋季运动会加油口号及加油稿
2019/08/19 职场文书
人生一定要学会的三样东西:放下、忘记、珍惜
2019/08/21 职场文书
导游词之太原天龙山
2020/01/02 职场文书
HAM-2000摩机图
2021/04/22 无线电