写一个简单的无参装饰器,计算math_info所需要的时间
# 1, 基础函数,计算出2的16次方的值def math_info():print("2**16的结果是:",2**64)
【Python中的函数装饰器】# 2, 计算wrApper所需要的时间import timedef wrapper(func):start_time=time.time()res = math_info()print("用时: ",float(time.time() - start_time))return reswrapper(math_info)2**64的结果是: 18446744073709551616用时:0.004000186920166016
步骤2改变了原函数的调用方式,所以不能使用(违反了开放封闭原则)
# 3, 换一种为函数体传值的方式,即将值包给函数def timer(func):def wrapper(): # 引用外部作用域的变量funcstart_time=time.time()res=func()stop_time=time.time()print("用时: ",float(time.time() - start_time))return resreturn wrapper# 得到math_info=wrapper,wrapper携带对外作用域的引用:func=原始的math_infomath_info=timer(math_info)# 执行的是wrapper(),在wrapper的函数体内再执行最原始的math_infomath_info()
步骤3写法我们不推荐,因为代码量变多了,最主要的是Python为我们提供了一个语法糖,我们可以使用语法糖更简便的写出同样的功能
# 完整的无参装饰器import timedef timer(func):def wrapper(): # 引用外部作用域的变量funcstart_time=time.time()res=func()stop_time=time.time()print("用时: ",float(time.time() - start_time))return resreturn wrapper@timer# @timer就相当于math_info=timer(math_info)def math_info():time.sleep(2)print("2**64的结果是:",2**64)math_info()2**64的结果是: 18446744073709551616用时:2.004000186920166016
其实只要记住,装饰器的目的是在不改变原函数代码及调用方法的前提下添加新的功能
推荐阅读
- Python正则表达式保姆式教学,带你精通大名鼎鼎的正则
- PHP时间函数总结
- 收藏多年的MySQL函数大全笔记,用到的时候翻一下,百度都省了
- 某些音乐只能听一分钟?Python绕过反爬,完美下载音乐
- 莳萝子在卤肉中的用量,莳萝在烹调中的作用及用法
- 为什么皇太极那么宠爱海兰珠?历史中的皇太极真的那么爱海兰珠吗
- 十大名茶中的绿茶,安徽十大名茶介绍
- 上大学怀念高中生活?好想念高中的日子
- 扔掉Vlookup函数,Excel多条件查询,只看这一篇就够了
- 风花雪月中的风分别是指什么风?