在不修改一个功能内源代码以及调用方式的前提下,为其添加新功能.
装饰器满足:
1.不修改被装饰函数内的代码
2.不修改被装饰函数的调用方式(例如 func() 调用)
3.满足前两点的前提下,为函数增添功能
示例
此函数计算了800的50000次幂
def func01():
num = 800**50000 # 计算800的50000次幂
return num
print(func01())
他的调用方式是func01() ,现在需要在不改变调用方式与其内部代码的情况下知道其计算使用的时间是多久.
import time
def timmer(f): # 测算传入函数运行所用的时间
def func():
start = time.time() # 开始时间
f() # 运行计算函数
end = time.time() # 结束时间
print(end - start) # 结束时间减去开始时间 打印运行所消耗的时间
return func
@timmer # 加装饰器 测量计算所用的时间
def func01():
num = 800**50000 # 计算800的50000次幂
return num
print(func01())
但是现在的问题是运行时间得到了结果,但是print(func01())打印的是空置而不是800的50000次幂.
因为此时运行func01()调用的实际是func(),而func()没有返回值,我们在func()中把f()的返回值接收一下并设置为func()的返回值就可以了.
import time
def timmer(f): # 测算传入函数运行所用的时间
def func():
start = time.time() # 开始时间
ff = f() # 运行计算函数
end = time.time() # 结束时间
print(end - start) # 结束时间减去开始时间
return ff
return func
@timmer # 加装饰器 测量计算所用的时间
def func01():
num = 800**50000 # 计算800的50000次幂
return num
print(func01())
如果被装饰的函数需要传入参数
import time
def timmer(f): # 测算传入函数运行所用的时间
def func(str01):
start = time.time() # 开始时间
ff = f(str01) # 运行计算函数
end = time.time() # 结束时间
print(end - start) # 结束时间减去开始时间
return ff
return func
@timmer # 加装饰器 测量计算所用的时间
def func01(str01):
num = 800**50000 # 计算800的50000次幂
return str(num) + str01
print(func01('尾巴'))