Python中的函数装饰器

写一个简单的无参装饰器,计算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其实只要记住,装饰器的目的是在不改变原函数代码及调用方法的前提下添加新的功能





    推荐阅读