装饰器

1.什么是装饰器?
器指的是工具,可以定义成函数
装饰指的是为其他事物添加额外的东西点缀
合在一起的意思是:装饰器指的是定义一个函数,该函数为其他函数增加额外的功能
2.为何要用装饰器?
开放封闭原则:开放指的是对拓展功能是开放的,封闭指的是对修改源代码是封闭的
装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被修饰对象添加新功能
# 需求:在不修改index函数的源代码以及调用方式的前提下为其添加统计运行时间的功能
# def index(x,y):
# time.sleep(3)
# print('index %s %s' %(x,y))
# 方案一:改变了源代码
# import time
# def index(x,y):
# start_time=time.time()
# time.sleep(1)
# print('index %s %s' %(x,y))
# end_time=time.time()
# print("运行时间为:%s"%(end_time-start_time))
# index(1,2)
# 方案二:源代码不变 但出现代码冗余
# import time
# def index(x,y):
# time.sleep(3)
# print('index %s %s' %(x,y))
# start_time=time.time()
# index(1,2)
# end_time=time.time()
# print("运行时间为:%s"%(end_time-start_time))
# start_time=time.time()
# index(5,6)
# end_time=time.time()
# print("运行时间为:%s"%(end_time-start_time))
# 方案三:源代码不变,冗余减小,但只对于index函数有效
# import time
# def index(x,y):
# time.sleep(3)
# print('index %s %s' %(x,y))
# def wrapper(x,y):
# start_time=time.time()
# index(x,y)
# end_time=time.time()
# print("运行时间为:%s"%(end_time-start_time))
# wrapper(1,2 )
# 方案三优化:
import time
def timer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
end_time=time.time()
print("运行时间为:%s"%(end_time-start_time))
return res
return wrapper
# timer=timer(index)
# timer(1,2)
@timer
def index(x,y):
time.sleep(3)
print('index %s %s' %(x,y))
index(5,6)
@timer
def haha():
time.sleep(1)
print("小朋友你是不是有很多问好?")
return 666
# timer=timer(haha)#@timer 等价于timer=timer(haha)
# res=timer()
# print(res)
haha()
原文地址:https://www.cnblogs.com/mayrain/p/12555381.html