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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python中random模块生成随机数详解
Mar 10 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
Python中sort和sorted函数代码解析
Jan 25 Python
使用tensorflow实现线性svm
Sep 07 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
python3下pygame如何实现显示中文
Jan 11 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python中zipfile压缩包模块的使用
May 14 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
一个php作的文本留言本的例子(三)
2006/10/09 PHP
其他功能
2006/10/09 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
教你30秒发布一个TypeScript包到NPM的方法步骤
2019/07/22 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
python基于爬虫+django,打造个性化API接口
2021/01/21 Python
解释一下钝化(Swap out)
2016/12/26 面试题
材料化学应届生求职信
2013/10/09 职场文书
2014教师年度思想工作总结
2014/11/10 职场文书
安全员岗位职责
2015/02/10 职场文书
会计岗位职责范本
2015/04/02 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
辩论赛新闻稿
2015/07/17 职场文书
结婚典礼致辞
2015/07/28 职场文书
小程序实现筛子抽奖
2021/05/26 Javascript
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
python神经网络 使用Keras构建RNN训练
2022/05/04 Python