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的内建模块collections的教程
Apr 28 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
如何卸载python插件
Jul 08 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 Python
Python制作表白爱心合集
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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP session常见问题集锦及解决办法总结
2007/03/18 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
PHP count()函数讲解
2019/02/03 PHP
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
Express.JS使用详解
2014/07/17 Javascript
javascript 实现map集合
2015/04/03 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
如何在JavaScript中使用localStorage详情
2021/02/04 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
Python3的介绍、安装和命令行的认识(推荐)
2018/10/20 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
python获取array中指定元素的示例
2019/11/26 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
政法大学毕业生自荐信范文
2014/01/01 职场文书
岗位竞聘书范文
2014/03/31 职场文书
公司担保书格式范文
2014/05/12 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
建房合同协议书
2016/03/21 职场文书