1. 程式人生 > >python之路--裝飾器

python之路--裝飾器

1, 通用裝飾器寫法:
python裡面的動態代理.
存在的意義: 在不破壞原有函式和原有函式呼叫的基礎上. 給函式新增新的功能
def wrapper(fn): #  fn是目標函式.
    def inner(*args, **kwargs): # 為了目標函式的傳參
        '''在執行目標函式之前.....'''
        ret = fn(*args, **kwargs) # 呼叫目標函式, ret是目標函式的返回值
        '''在執行目標函式之後....'''
        return ret  # 把目標函式返回值返回. 保證函式正常的結束
    return inner
@wrapper  # target_func = wrapper(target_func)
def target_func():
    pass
target_func() # 此時執行的是inner

2, 帶有引數的裝飾器

def wrapper_out(flag): # 裝飾器本身的引數
    def wrapper(fn): # 目標函式
        def inner(*args, **kwargs): # 目標函式執行需要的引數
            if flag == True:
                print("問問同學,看看有沒有場地")
                ret = fn(*args, **kwargs) # 在執行目標函式之前
                print("同學騙我. 恨你")
                return ret
            else:
                ret = fn(*args, **kwargs)  # 在執行目標函式之前
                return ret
        return inner
    return wrapper
# # 語法糖 @裝飾器
@wrapper_out(True) # 先執行wrapper_out(True) 返回一個裝飾器   再和@拼接  @裝飾器
def play(): # 被 wrapper裝飾
    print("走啊,打球去")
play()

 3, 多個裝飾器裝飾同一個函式

def wrapper1(fn):
    def inner(*args, **kwargs):
        print("1111111")
        ret = fn(*args, **kwargs)
        print("2222222")
        return ret
    return inner
def wrapper2(fn):
    def inner(*args, **kwargs):
        print("3333333")
        ret = fn(*args, **kwargs)
        print("44444444")
        return ret
    return inner
def wrapper3(fn):
    def inner(*args, **kwargs):
        print("555555")
        ret = fn(*args, **kwargs)
        print("666666")
        return ret
    return inner
# 就近原則
@wrapper1
@wrapper2
@wrapper3
def func():
    print("我是可憐的func")
func()
# 1 2 3  func 3 2 1