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类继承与子类实例初始化用法分析
Apr 17 Python
windows下安装Python和pip终极图文教程
Mar 05 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
python DataFrame 取差集实例
Jan 30 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
python用requests实现http请求代码实例
Oct 31 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 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
短波问题解答
2021/02/28 无线电
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
JS特权方法定义作用以及与公有方法的区别
2013/03/18 Javascript
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
浅谈JavaScript 声明提升
2020/09/14 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
如何基于Python批量下载音乐
2019/11/11 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
"引用"与指针的区别是什么
2016/09/07 面试题
高中生自我评语大全
2014/01/19 职场文书
2014年元旦联欢会活动策划方案
2014/02/16 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
詹天佑教学反思
2014/04/30 职场文书
伏羲庙导游词
2015/02/09 职场文书
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
实现一个简单得数据响应系统
2021/11/11 Javascript