使用閉包簡單模擬裝飾器的實現原理
def verify(func):
def test():
print("驗證通過")
func()
return test
def func1():
print("func1被調用")
func1()#普通調用
func1 = verify(func1)#裝飾器修飾後
func1()#裝飾器調用
- 運行結果
func1被調用
-------裝飾器-------
驗證通過
func1被調用
裝飾器簡單使用
def verify(func):
def test():
print("驗證通過")
func()
return test
@verify
def func1():
print("func1被調用")
func1()
- 運行結果
驗證通過
func1被調用
裝飾器被調用時間檢測
def verify(func):
print("裝飾器被調用")
def test():
print("驗證通過")
func()
return test
@verify#只要解釋器讀到這 就進行裝飾 而不是等到被調用時進行
def func1():
print("func1被調用")
- 運行結果
裝飾器被調用
雖然沒有顯式調用函數,但是解釋器讀到裝飾器位置隱式調用,而非等到顯式調用函數才執行裝飾器
對有參數的函數進行裝飾 - 使用可變參數接收
def verify(func):
print("裝飾器被調用")
def test(*args,**kwargs):
print("驗證通過")
func(*args,**kwargs)
return test
@verify#只要解釋器讀到這 就進行裝飾 而不是等到被調用時進行
def func1(a,b):
print("func1被調用 a:%d b:%d"%(a,b))
func1(1,2)
- 運行結果
裝飾器被調用
驗證通過
func1被調用 a:1 b:2
通用裝飾器-對帶參數有返回值的函數進行裝飾
def verify(func):
print("裝飾器被調用")
def test(*args,**kwargs):
print("驗證通過")
return func(*args,**kwargs)
return test
@verify#只要解釋器讀到這 就進行裝飾 而不是等到被調用時進行
def func1(a,b):
return ("func1被調用 a:%d b:%d"%(a,b))
print(func1(1,2))
- 運行結果
裝飾器被調用
驗證通過
func1被調用 a:1 b:2
帶有參數的裝飾器
def verifyOut(arg):
def verify(func):
print("裝飾器被調用")
def test(*args,**kwargs):
print("驗證通過")
return func(*args,**kwargs)
return test
return verify
@verifyOut("verifyOut")#只要解釋器讀到這 調用verifyOut(arg) 返回後相當於@verify
def func1(a,b):
return ("func1被調用 a:%d b:%d"%(a,b))
print(func1(1,2))
- 運行結果
def verifyOut(arg):
def verify(func):
print("裝飾器被調用")
def test(*args,**kwargs):
print("驗證通過")
return func(*args,**kwargs)
return test
return verify
@verifyOut("verifyOut")#只要解釋器讀到這 調用verifyOut(arg) 返回後相當於@verify
def func1(a,b):
return ("func1被調用 a:%d b:%d"%(a,b))
print(func1(1,2))