1. 程式人生 > >python 修飾器

python 修飾器

修飾器 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:參考資料寫的更好

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


本文出自 “11210358” 博客,請務必保留此出處http://11220358.blog.51cto.com/11210358/1966438

python 修飾器