python函数装饰器之带参数的函数和带参数的装饰器用法示例


Posted in Python onNovember 06, 2019

本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法。分享给大家供大家参考,具体如下:

1. 函数带多个参数

# 普通的装饰器, 打印函数的运行时间
def decrator(func):
  def wrap(*args, **kwargs):
    start_time = time.time()
    res = func(*args, **kwargs)
    end_time = time.time()
    print('运行时间为', end_time-start_time)
    return res
  return wrap

2. 装饰器带有多个参数

当装饰器带有多个参数的时候, 装饰器函数就需要多加一层嵌套:

比如:

def decrator(*dargs, **dkargs):
  def wrapper(func):
    def _wrapper(*args, **kargs):
      print ("装饰器参数:", dargs, dkargs)
      print ("函数参数:", args, kargs)
      return func(*args, **kargs)
    return _wrapper
  return wrapper

为什么被装饰函数体可以传入内层呢?

装饰器函数有多个参数, 需要以@decrator(1, a=2)的方式使用, 这时候decrator是已经执行的(因为加了括号), 可以粗略的理解为加载被装饰函数的上的是wrapper, 所以这和普通的装饰器并无差别.

又如flask源码中的:

def route(self, rule, **options):
    """Like :meth:`Flask.route` but for a blueprint. The endpoint for the
    :func:`url_for` function is prefixed with the name of the blueprint.
    """
    def decorator(f):
      endpoint = options.pop("endpoint", f.__name__)
      self.add_url_rule(rule, endpoint, f, **options)
      return f
    return decorator

flask的蓝图route源码中的装饰器, 最内层直接返回return f 并没有多加一层处理的函数, 在无需对被装饰函数进行过多处理的时候这是较为方便的做法. route源码中只是对装饰器参数进行了处理.

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python文档生成工具pydoc使用介绍
Jun 02 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
pandas实现将日期转换成timestamp
Dec 07 Python
python实现视频读取和转化图片
Dec 10 Python
详解python tkinter模块安装过程
Jan 06 Python
Python单元测试模块doctest的具体使用
Feb 10 Python
Python 如何对文件目录操作
Jul 10 Python
如何在scrapy中集成selenium爬取网页的方法
Nov 18 Python
Python开发工具Pycharm的安装以及使用步骤总结
Jun 24 Python
Python list与NumPy array 区分详解
Nov 06 #Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 #Python
django 简单实现登录验证给你
Nov 06 #Python
Python数据可视化:箱线图多种库画法
Nov 06 #Python
使用Python完成15位18位身份证的互转功能
Nov 06 #Python
python3.8 微信发送服务器监控报警消息代码实现
Nov 05 #Python
python SVD压缩图像的实现代码
Nov 05 #Python
You might like
PHP 第一节 php简介
2012/04/28 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
Javascript var变量隐式声明方法
2009/10/19 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
继续学习javascript闭包
2015/12/03 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
vue props default Array或是Object的正确写法说明
2020/07/30 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python代码的打包与发布详解
2014/07/30 Python
Djang中静态文件配置方法
2015/07/30 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
优秀实习自我鉴定
2013/12/04 职场文书
结婚邀请函范文
2014/01/14 职场文书
微信营销策划方案
2014/02/24 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2014年租房协议书范本
2014/10/30 职场文书
工厂见习报告范文
2014/10/31 职场文书
保险内勤岗位职责
2015/04/13 职场文书
2019七夕节祝福语36句,快来收藏吧
2019/08/06 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL