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函数缺省值与引用学习笔记分享
Feb 10 Python
python正则表达式re模块详细介绍
May 29 Python
python实现读取命令行参数的方法
May 22 Python
python如何获取服务器硬件信息
May 11 Python
python如何爬取个性签名
Jun 19 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
Nov 29 Python
Python中bisect的使用方法
Dec 31 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
Django+python服务器部署与环境部署教程详解
Mar 30 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
解析Win7 XAMPP apache无法启动的问题
2013/06/26 PHP
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
关于Jquery操作Cookie取值错误的解决方法
2013/08/26 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
老生常谈js中0到底是 true 还是 false
2017/03/08 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Python类继承和多态原理解析
2020/02/05 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
python名片管理系统开发
2020/06/18 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
大学毕业的自我鉴定
2013/10/08 职场文书
商场总经理岗位职责
2014/02/03 职场文书
房地产推广策划方案
2014/05/19 职场文书
遗嘱继承权公证书
2015/01/26 职场文书
教师思想工作总结2015
2015/05/13 职场文书
党员转正申请报告
2015/05/15 职场文书
贷款担保书范本
2015/09/22 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏