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多线程抓取天涯帖子内容示例
Apr 03 Python
python中的多线程实例教程
Aug 27 Python
python实现逆波兰计算表达式实例详解
May 06 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
Python实现图片转字符画的示例代码
Aug 21 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
对Python w和w+权限的区别详解
Jan 23 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
python梯度下降算法的实现
Feb 24 Python
Django 再谈一谈json序列化
Mar 16 Python
Pytorch中的学习率衰减及其用法详解
Jun 05 Python
python函数的两种嵌套方法使用
Apr 02 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三元运算的2种写法代码实例
2014/05/12 PHP
PHP中文编码小技巧
2014/12/25 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
PHP文件缓存smarty模板应用实例分析
2016/02/26 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
php实现微信发红包功能
2018/07/13 PHP
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
实现js保留小数点后N位的代码
2014/11/13 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Python 闭包的使用方法
2017/09/07 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
Python字典及字典基本操作方法详解
2018/01/30 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
python爬取足球直播吧五大联赛积分榜
2018/06/13 Python
python定时关机小脚本
2018/06/20 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
超市后勤自我鉴定
2014/01/17 职场文书
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
自主招生学校推荐信
2014/09/26 职场文书
2014年党务公开工作总结
2014/12/09 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL