python如何为被装饰的函数保留元数据


Posted in Python onMarch 21, 2018

本文实例为大家分享了python为被装饰的函数保留元数据的具体代码,供大家参考,具体内容如下

案例:

       在函数对象中保存着一些函数的元数据,如:

              f.__name__           函数名

              f.__doc__              函数文档

              f.__moudle__       函数所属模块名

              f.__dict__              属性字典

              f.__defaults__       默认参数组

              ……

       在使用装饰器后,在装饰器里访问以上属性时,我们看到的是装饰器函数的元数据

       需求:

              实现在装饰器函数中,保留 被装饰函数 的元数据

如何实现?

       通过 functools中的wraps, update_wrapper方法实现,每个都可单独实现

#!/usr/bin/python3
 
import time
from functools import (wraps, update_wrapper, WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
 
 
def count_time(func):
  """
  给目标函数加上计算运行时间统计
  """
  # 这个装上器和update_wrapper一样,默认参数WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  @wraps(func)
  def wrapper(*args, **kwargs):
    start_time = time.time()
     
    # 定义result接收函数返回值,并且在装饰函数最后返回回去
    resutl = func(*args, **kwargs)
    print('运行时间:', time.time()-start_time)
    return resutl
   
  # 其中默认参数 WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES
  # update_wrapper(wrapper, func)
  return wrapper
 
 
@count_time
def add(num=100):
  """
  计算 0~num 累加值,默认num=100
  """
  time.sleep(1)
  return sum([x for x in range(num+1)])
 
if __name__ == '__main__':
  print('函数名:', add.__name__)
  print('属性字典:', add.__dict__)
  print('函数默认参数:', add.__defaults__)
  print('函数所在模块:', add.__module__)
  print('函数文档:', add.__doc__)
   
  # 打印两个默认参数
  print(WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)
  result = add()
  print(result)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现多线程的方式及多条命令并发执行
Jun 07 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
Python Django的安装配置教程图文详解
Jul 17 Python
详解python中index()、find()方法
Aug 29 Python
python的reverse函数翻转结果为None的问题
May 11 Python
Python urllib库如何添加headers过程解析
Oct 05 Python
Python 使用office365邮箱的示例
Oct 29 Python
详解Python利用configparser对配置文件进行读写操作
Nov 03 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 #Python
Python反转序列的方法实例分析
Mar 21 #Python
Python常见工厂函数用法示例
Mar 21 #Python
python如何统计序列中元素
Jul 31 #Python
python如何读写json数据
Mar 21 #Python
python如何读写csv数据
Mar 21 #Python
python如何让类支持比较运算
Mar 20 #Python
You might like
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
js实现多张图片延迟加载效果
2017/07/17 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python对文件操作知识汇总
2016/05/15 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python如何调用外部系统命令
2019/08/07 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
Python自动创建Excel并获取内容
2020/09/16 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
广告宣传策划方案
2014/05/21 职场文书
保密工作整改报告
2014/11/06 职场文书
大一学生个人总结
2015/02/15 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS