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操作数据库之sqlite3打开数据库、删除、修改示例
Mar 13 Python
python格式化字符串实例总结
Sep 28 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
selenium+python实现自动化登录的方法
Sep 04 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
如何在Python对Excel进行读取
Jun 04 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
python中什么是面向对象
Jun 11 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
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
9个经典的PHP代码片段分享
2014/12/18 PHP
YiiFramework入门知识点总结(图文教程)
2015/12/28 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
js实现图片漂浮效果的方法
2015/03/02 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
vue.js如何将echarts封装为组件一键使用详解
2017/10/10 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
python中List的sort方法指南
2014/09/01 Python
python字典基本操作实例分析
2015/07/11 Python
对Python中内置异常层次结构详解
2018/10/18 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
django云端留言板实例详解
2019/07/22 Python
Python Lambda函数使用总结详解
2019/12/11 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
政治学求职信
2014/06/03 职场文书
2014年营业员工作总结
2014/11/18 职场文书
违纪检讨书
2015/01/27 职场文书
观后感开头
2015/06/19 职场文书
python pyhs2 的安装操作
2021/04/07 Python