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设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python保存数据到本地文件的方法
Jun 23 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
浅谈Django中的QueryDict元素为数组的坑
Mar 31 Python
关于python中导入文件到list的问题
Oct 31 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 Python
Pandas数据分析的一些常用小技巧
Feb 07 Python
Python利用FlashText算法实现替换字符串
Mar 31 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
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
php字符串过滤与替换小结
2015/01/26 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
用window.location.href实现刷新另个框架页面
2007/03/07 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
js编写当天简单日历效果【实现代码】
2016/05/03 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
js编写选项卡效果
2017/05/23 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
python实现根据图标提取分类应用程序实例
2014/09/28 Python
python 监听salt job状态,并任务数据推送到redis中的方法
2019/01/14 Python
python conda操作方法
2019/09/11 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
python中doctest库实例用法
2020/12/31 Python
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
六一儿童节活动策划方案
2014/01/27 职场文书
财务出纳岗位职责
2014/02/03 职场文书
音乐节策划方案
2014/06/09 职场文书
领导干部失职检讨书
2015/05/05 职场文书
Mysql systemctl start mysqld报错的问题解决
2021/06/03 MySQL
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
Spring中的@Transactional的工作原理
2022/06/05 Java/Android