简单说明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实现文件按照日期命名的方法
Jul 09 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
浅谈python之新式类
Aug 12 Python
关于Python解包知识点总结
May 05 Python
Python内置异常类型全面汇总
May 28 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
python缩进长度是否统一
Aug 02 Python
用python绘制樱花树
Oct 09 Python
Python图像读写方法对比
Nov 16 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
python基于turtle绘制几何图形
Jun 15 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递归复制、移动目录的自定义函数分享
2014/11/18 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
FCK调用方法..
2006/12/21 Javascript
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
vue内置指令详解
2018/04/03 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
跟老齐学Python之类的细节
2014/10/13 Python
Python3实现Web网页图片下载
2016/01/28 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
python里运用私有属性和方法总结
2019/07/08 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
python装饰器使用实例详解
2019/12/14 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
Django操作session 的方法
2020/03/09 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
python实现视频压缩功能
2020/12/18 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
借款协议书
2014/09/16 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
java如何实现socket连接方法封装
2021/09/25 Java/Android
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
Nginx如何配置根据路径转发详解
2022/07/23 Servers