#装饰器的作用,是不想修改函数的调用方式,但是还想在原来的函数前后添加功能
import time def func(): # 用户程序 time.sleep(1.0) # 停留1.0秒数 print('老板好大家好') #装饰器函数 def timmer(f): # 一个计算一个函数执行时间的函数 (装饰器函数) def inner(): start = time.time() # 开始时间 f() # 调用用户的函数并执行 (被装饰的函数) end = time.time() # 结束时间 print(end - start) # 打印执行的时间 return inner func = timmer(func) # 执行计时程序调用用户程序统计运行时间 func()
#加上语法糖@timmer后,同样的效果如下
#装饰器函数 def timmer(f): # 一个计算一个函数执行时间的函数 (装饰器函数) def inner(): start = time.time() # 开始时间 f() # 调用用户的函数并执行 (被装饰的函数) end = time.time() # 结束时间 print(end - start) # 打印执行的时间 return inner @timmer #语法糖 @装饰器函数名 def func(): # 被装饰的函数 time.sleep(1.0) # 停留1.0秒数 print('老板好大家好') func()
#装饰器函数 具有返回值 def timmer(f): # 一个计算一个函数执行时间的函数 (装饰器函数) def inner(): start = time.time() # 开始时间 ret = f() # 调用用户的函数并执行 (被装饰的函数) end = time.time() # 结束时间 print(end - start) # 打印执行的时间 return ret return inner @timmer #语法糖 @装饰器函数名 def func(): # 被装饰的函数 time.sleep(1.0) # 停留1.0秒数 print('老板好大家好') return '新年好' ret = func() print(ret)
#装饰器 带参数的函数 具有返回值(为完整的装饰器函数)
def timmer(f): # 一个计算一个函数执行时间的函数 (装饰器函数) def inner(*args,**kwargs): start = time.time() # 开始时间 ret = f(*args,**kwargs) # 调用用户的函数并执行 (被装饰的函数) end = time.time() # 结束时间 print(end - start) # 打印执行的时间 return ret return inner @timmer #语法糖 @装饰器函数名 def func(a,b): # 被装饰的函数 time.sleep(0.1) # 停留0.1秒数 print('老板好大家好',a,b) return '新年好' ret = func(1,2) print(ret) ret = func(3,b = 4) print(ret)
#完整的装饰器函数使用方法(装饰器的固定模式)
@wrapper 等同于 func = wrapper(func)
def wrapper(f): # 装饰器函数 def inner(*args,**kwargs): '''在被装饰函数前要做的事''' ret = f(*args,**kwargs) # 调用用户的函数并执行 (被装饰的函数) '''在调用被装饰函数之后要做的事''' return ret return inner @wrapper #语法糖 @装饰器函数名 def func(*args): # 被装饰的函数 print('老板好大家好',args) return '新年好' ret = func([1,2,3],'df',(2,3,4)) print(ret)
#原则:开放封闭原则
#开放:对扩展是开放的
#封闭:对修改是封闭的