python 修飾器

因困擾自己多時,打算整理一下修飾器到底是什麼?
參考資料:http://python.jobbole.com/82344/

修飾器
1. 定義2個函數
2. 基本實現
3. 問題:實現後, 要修改原來代碼中的變量名, funcB()改爲funcA(funcB)
4. 解決方法:讓funcB賦值等於funcA(funcB),用時就是funcB(), 不用修改原來代碼, 這個要求需funcA(funcB)返回的是一個函數
    a) 所以要返回一個函數,則加一個函數 wrapper(),然後return 函數; 將原來代碼寫進wrapper(),方便多次調用
5. python的語法糖@, funcB = funcA(funcB),@funcA, 簡寫代碼, 注意寫對位置,寫在要funcB()的前面

基本實現
def funcA(func):
    print('這是11111111')
    funcB_copy = func()
    return funcB_copy

def funcB():
    print('這是2222222222')

funcA(funcB)
funcB()


# 1. 問題:實現後, 要修改原來代碼中的變量名, funcB()改爲funcA(funcB)
# 2. 解決方法:讓funcB賦值等於funcA(funcB),用時就是funcB(), 不用修改原來代碼, 這個要求需funcA(funcB)返回的是一個函數
#     所以要返回一個函數,則加一個函數 wrapper(),然後return 函數; 將原來代碼寫進wrapper(),方便多次調用

def funcA(func):
    def wrapper():
        print('這是11111111')
        funcB_copy = func()
        return funcB_copy
    return wrapper

def funcB():
    print('這是2222222222')


funcB = funcA(funcB) #這是func2 = wrapper()函數
funcA() #func2()執行的是wrapper()

最後python的語法糖@, 將funcB = funcA(funcB)改爲 @funcA,簡寫代碼, 注意寫對位置,寫在funcB()的前面
def funcA(func):
    def wrapper():
        print('這是11111111')
        funcB_copy = func()
        return funcB_copy
    return wrapper

@funcA
def funcB():
    print('這是2222222222')

funcB()


# 原來是帶參數函數
def funcA(func):
    def wrapper(a, b): # 注意這裏
        print('這是11111111')
        funcB_copy = func(a, b) #注意這裏
        return funcB_copy
    return wrapper

@funcA
def funcB(a, b):
    print('這是2222222222')
    print(a, b)

funcB()

基本調試幾遍就會了
ps:參考資料寫的更好

這篇文章不是轉載,內容也不是原創,我也不知道選什麼(只有原創、轉載、翻譯), 是參考文章的自己理解版,暫時標爲原創,如有不妥請告訴我


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