裝飾器本質上是一個python函數,他能夠讓其餘函數在不須要作任何代碼變更的前提下增長額外功能,裝飾器的返回值也是一個函數對象。python
應用場景:插入日誌,性能測試,事務處理,緩存,權限校驗緩存
做用:爲了已經存在的函數或者對象添加額外的功能app
例子1: def w1(func): def inner(): #能夠加if判斷 print("---驗證---") func() return inner #f1=w1(f1) @w1 def f1(): print('f1') #調用 f1()
裝飾是從下裝到上,調用是從上到下。函數
def w1(func): print("--正在裝飾1--") def inner(): print("--正在驗證1--") func() return inner def w2(func): print("--正在裝飾2--") def inner(): print("--正在驗證2--") func() return inner @w1 @w2 def f1(): print("--f1--") #裝飾倒着裝,調用是從上到下。 f1() ###執行結果### --正在裝飾2-- --正在裝飾1-- --正在驗證1-- --正在驗證2-- --f1--
from time import ctime, sleep def timefun(func): #給函數傳參數 def wrappedfunc(*args,**kw): print("%s called at %s"%(func.__name__, ctime())) func(*args,*kw) return wrappedfunc @timefun def foo(a,b,c): print(a+b+c) foo(1,2,3) foo called at Tue Jan 1 17:16:15 2019 6
def func(fun): def func_in(*args,**kwargs): #ret保存return 返回值,若是沒有返回值爲None ret = fun(*args,**kwargs) return ret return func_in @func def test(args): print("---%s--"%(args)) return "haha" print(test(1))
def func_arg(arg): def fun(fun): def func(): print("--記錄日誌--%s"%(arg)) if arg=="heihei": fun() else: pass return func return fun #1.先執行func_arg函數,return 結果是這個fun函數 #等於使用@fun 對test進行裝飾 @func_arg("heihei") def test(): print("--test--") test() --記錄日誌--heihei --test--
class test(object): #重寫這個call方法,讓類加上()就能夠被調用。 def __call__(self): print("--test--") t = test() t() --打印結果-- --test-- ###### 類裝飾器 class Test(object): def __init__(self,func): print("---初始化--") print("func name is %s"%(func.__name__)) self.__func = func def __call__(self): print("--裝飾器中的功能---") self.__func() @Test def test(): print("---test--") test() --打印結果-- ---初始化-- func name is test --裝飾器中的功能--- ---test--