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内置的字符串处理函数整理
Jan 29 Python
c++生成dll使用python调用dll的方法
Jan 20 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
对Python3中的input函数详解
Apr 22 Python
Python读写docx文件的方法
May 08 Python
python获取url的返回信息方法
Dec 17 Python
Python骚操作之动态定义函数
Mar 26 Python
pyQt5实时刷新界面的示例
Jun 25 Python
超实用的 30 段 Python 案例
Oct 10 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
使用TensorBoard进行超参数优化的实现
Jul 06 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中转义mysql语句的实现代码
2011/06/24 PHP
php session安全问题分析
2011/06/24 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
动态样式类封装JS代码
2009/09/02 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
JavaScript命令模式原理与用法实例详解
2020/03/10 Javascript
Python中的lstrip()方法使用简介
2015/05/19 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
Python 装饰器使用详解
2017/07/29 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python 内置模块详解
2019/01/01 Python
python读写csv文件方法详细总结
2019/07/05 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
秋季红领巾广播稿
2014/01/27 职场文书
风险评估实施方案
2014/03/09 职场文书
代理词怎么写
2015/05/25 职场文书
工资证明范本
2015/06/12 职场文书