python-裝飾器-爲函數添加功能但不改變調用方式

使用閉包簡單模擬裝飾器的實現原理

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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章