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装饰器基础详解
Mar 09 Python
python图书管理系统
Apr 05 Python
Python中str.join()简单用法示例
Mar 20 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
mac下如何将python2.7改为python3
Jul 13 Python
Python3多线程基础知识点
Feb 19 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
基于Python3.7.1无法导入Numpy的解决方式
Mar 09 Python
基于python实现生成指定大小txt文档
Jul 20 Python
浅谈对python中if、elif、else的误解
Aug 20 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
node实现登录图片验证码的示例代码
2018/04/20 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Python生成随机数的方法
2014/01/14 Python
Python遍历目录的4种方法实例介绍
2015/04/13 Python
django 发送手机验证码的示例代码
2018/04/25 Python
python解决字符串倒序输出的问题
2018/06/25 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
Python测试模块doctest使用解析
2019/08/10 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
公积金单位接收函
2014/01/11 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书