装饰器的详解
装饰器的作用
在不修改原有函数的基础之上添加指定的功能属性;主要应用与开放封闭原则中。
示例
import time 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(0.01) print('老板好同事好大家好') return '新年好' func = timmer(func) ret = func() print(ret)
装饰器的使用情景
情景1:基本装饰器
import time def wrapper(func): def funct(): start = time.time() func() end = time.time() return funct def func(): time.sleep(0.5) print('test') func = wrapper(func) func()
情景2:强化装饰器-有返回的装饰器
import time def wrapper(func): def Wrapper(): start = time.time() ret = func() end = time.time() return ret return Wrapper @wrapper def func(): time.sleep(0.5) print('hello world') return 'HELLO WORLD' Func = wrapper(func) print(Func())
情景3:强化装饰器-有一个参数
import time def timmer(f): #装饰器函数 def inner(*args): #(1,2) /(1) start = time.time() ret = f(*args) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(a): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a) return '新年好' ret = func(1) print(ret)
情景4:强化装饰器-有无穷参数
import time def timmer(f): #装饰器函数 def inner(*args,**kwargs): #(1,2) /(1) start = time.time() ret = f(*args,**kwargs) #f(1,2) #被装饰的函数 end = time.time() print(end - start) return ret return inner @timmer #语法糖 @装饰器函数名 def func(a,b): #被装饰的函数 time.sleep(0.01) print('老板好同事好大家好',a,b) return '新年好' ret = func(1,b = 2) print(ret)
装饰器的固定模式
def wrapper(func): #qqxing def inner(*args,**kwargs): ret = func(*args,**kwargs) #被装饰的函数 return ret return inner