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魔法方法-属性访问控制详解
Jul 25 Python
利用Python开发实现简单的记事本
Nov 15 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
PyQt5 pyqt多线程操作入门
May 05 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
django框架中间件原理与用法详解
Dec 10 Python
Python面向对象封装操作案例详解
Dec 31 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
Python流程控制常用工具详解
Feb 24 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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
php封装一个异常的处理类
2017/06/08 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
在Django的URLconf中使用多个视图前缀的方法
2015/07/18 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
python画微信表情符的实例代码
2019/10/09 Python
python 串行执行和并行执行实例
2020/04/30 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
大专应届生个人简历的自我评价
2013/10/15 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
学生手册评语
2014/05/05 职场文书
社区工作者演讲稿
2014/05/23 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
医院保洁员管理制度
2015/08/05 职场文书
广播稿:校园广播稿范文
2019/04/17 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA