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之重回函数
Oct 10 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
Python数据类型之Dict字典实例详解
May 07 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python 3.7.4 安装 opencv的教程
Oct 10 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python中upper是做什么用的
Jul 20 Python
python中的被动信息搜集
Apr 29 Python
Pandas搭配lambda组合使用详解
Jan 22 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 在文件指定行插入数据的代码
2010/05/08 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
为百度UE编辑器上传图片添加水印功能
2015/04/16 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
简单的网页广告特效实例
2017/08/19 Javascript
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python实现PS图像调整之对比度调整功能示例
2018/01/26 Python
Python实现的视频播放器功能完整示例
2018/02/01 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
python实现AES加密解密
2019/03/28 Python
春节到了 教你使用python来抢票回家
2020/01/06 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
python 监控logcat关键字功能
2020/09/04 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
HTML5使用drawImage()方法绘制图像
2014/06/23 HTML / CSS
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
物流管理专业应届生求职信
2013/11/21 职场文书
优秀教师主要事迹
2014/02/01 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书