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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
Python 序列的方法总结
Oct 18 Python
有趣的python小程序分享
Dec 05 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
python2 与python3的print区别小结
Jan 16 Python
Python内置模块logging用法实例分析
Feb 12 Python
详解Python数据分析--Pandas知识点
Mar 23 Python
基于python读取.mat文件并取出信息
Dec 16 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
Django之全局使用request.user.username的实例详解
May 14 Python
python 自动识别并连接串口的实现
Jan 19 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 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中for循环语句的几种变型
2007/03/16 PHP
php 正则表达式小结
2009/08/31 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
Javascript & DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
2007/06/02 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python3获取当前目录的实现方法
2019/07/29 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
python数字类型math库原理解析
2020/03/02 Python
使用python实现学生信息管理系统
2021/02/25 Python
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
管理站站长岗位职责
2013/11/27 职场文书
铁路个人事迹材料
2014/01/30 职场文书
20年同学聚会感言
2014/02/03 职场文书
眼镜促销方案
2014/03/15 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
工程承包协议书
2014/10/20 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书