简单说明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基础教程之元组操作使用详解
Mar 25 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
在Python的web框架中中编写日志列表的教程
Apr 30 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
pyqt5简介及安装方法介绍
Jan 31 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
python中with用法讲解
Feb 07 Python
python使用pymongo与MongoDB基本交互操作示例
Apr 09 Python
python实现程序重启和系统重启方式
Apr 16 Python
Keras模型转成tensorflow的.pb操作
Jul 06 Python
Python实现一个优先级队列的方法
Jul 31 Python
想学画画?python满足你!
Dec 24 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
上海永华YH-R296(华普R-96)12波段立体声收音机的分析和打理
2021/03/02 无线电
php Undefined index的问题
2009/06/01 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
详解js中Array的方法及技巧
2018/09/12 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
Python对List中的元素排序的方法
2018/04/01 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
pandas分批读取大数据集教程
2020/06/06 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
自行车租赁公司创业计划书
2014/01/28 职场文书
节电标语大全
2014/06/23 职场文书
会计学毕业生求职信
2014/06/25 职场文书
财产分割协议书范本
2014/11/03 职场文书
长城英文导游词
2015/01/30 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
舞出我人生观后感
2015/06/16 职场文书
三国演义读书笔记
2015/06/25 职场文书
Python何绘制带有背景色块的折线图
2022/04/23 Python