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 相关文章推荐
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python基于回溯法子集树模板实现图的遍历功能示例
Sep 05 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
Python字典对象实现原理详解
Jul 01 Python
基于python的Paxos算法实现
Jul 03 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 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中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
js实现圆盘记速表
2015/08/03 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
js实现碰撞检测
2021/01/29 Javascript
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Django 返回json数据的实现示例
2020/03/05 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
比利时香水网上商店:NOTINO
2018/03/28 全球购物
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
安全生产月演讲稿
2014/05/09 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
十岁生日答谢词
2015/01/05 职场文书
趣味运动会加油词
2015/07/18 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书