写一个简单的无参装饰器,计算math_info所需要的时间
# 1, 基础函数,计算出2的16次方的值
def math_info():
print("2**16的结果是:",2**64)
# 2, 计算wrApper所需要的时间
import time
def wrapper(func):
start_time=time.time()
res = math_info()
print("用时: ",float(time.time() - start_time))
return res
wrapper(math_info)
2**64的结果是: 18446744073709551616
用时: 0.004000186920166016
步骤2改变了原函数的调用方式,所以不能使用(违反了开放封闭原则)
# 3, 换一种为函数体传值的方式,即将值包给函数
def timer(func):
def wrapper(): # 引用外部作用域的变量func
start_time=time.time()
res=func()
stop_time=time.time()
print("用时: ",float(time.time() - start_time))
return res
return wrapper
# 得到math_info=wrapper,wrapper携带对外作用域的引用:func=原始的math_info
math_info=timer(math_info)
# 执行的是wrapper(),在wrapper的函数体内再执行最原始的math_info
math_info()
步骤3写法我们不推荐,因为代码量变多了,最主要的是Python/ target=_blank class=infotextkey>Python为我们提供了一个语法糖,我们可以使用语法糖更简便的写出同样的功能
# 完整的无参装饰器
import time
def timer(func):
def wrapper(): # 引用外部作用域的变量func
start_time=time.time()
res=func()
stop_time=time.time()
print("用时: ",float(time.time() - start_time))
return res
return 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
其实只要记住,装饰器的目的是在不改变原函数代码及调用方法的前提下添加新的功能