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生成随机图形验证码详解
Nov 08 Python
Python使用zip合并相邻列表项的方法示例
Mar 17 Python
python3之模块psutil系统性能信息使用
May 30 Python
Python实现的合并两个有序数组算法示例
Mar 04 Python
python+os根据文件名自动生成文本
Mar 21 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Python tkinter常用操作代码实例
Jan 03 Python
PyTorch 解决Dataset和Dataloader遇到的问题
Jan 08 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
python使用建议与技巧分享(二)
Aug 17 Python
python爬取豆瓣电影TOP250数据
May 23 Python
python实现简易自习室座位预约系统
Jun 30 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静态变量当缓存的方法
2013/11/13 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
纯php生成随机密码
2015/10/30 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
Firefox window.close()的使用注意事项
2009/04/11 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
jquery实现上传文件进度条
2020/03/26 jQuery
element中的$confirm的使用
2020/04/26 Javascript
python字符串排序方法
2014/08/29 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
python 中字典嵌套列表的方法
2018/07/03 Python
python生成器推导式用法简单示例
2019/10/08 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
毕业论文评语大全
2014/04/29 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
教师师德考核自我评价
2014/09/13 职场文书
股东授权委托书范本
2014/09/13 职场文书
MySQL系列之四 SQL语法
2021/07/02 MySQL