python之路--裝飾器
阿新 • • 發佈:2018-12-14
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