裝飾器(重點,難點) 開閉原則: 對功能的擴展開放 對代碼的修改是封閉的 在目標函數前和後插入一段新的代碼.不改變原來的代碼 通用裝飾器寫法: # 存在的意義: 在不破壞原有函數調用的基礎上,給韓式添加新的功能 def wrapper(fn): # fn是目標函數 def inner(*args, ...
裝飾器(重點,難點) 開閉原則: 對功能的擴展開放 對代碼的修改是封閉的 在目標函數前和後插入一段新的代碼.不改變原來的代碼 通用裝飾器寫法: # 存在的意義: 在不破壞原有函數調用的基礎上,給韓式添加新的功能 def wrapper(fn): # fn是目標函數 def inner(*args, **kwargs): # 聚合, 為了目標函數的傳參 ''''在目標函數之前....'''' ret = fn(*arg, **kwargs) # 打散, 調用目標函數,ret是目標韓式的返回值 ''''在目標函數之後....''' return ret #把目標函數返回值返回.保證函數正常的結束 return inner @wrapper ### func = wrapper(func) == @wrapper def func(): pass #### func = wrapper(func) #此時fn就是func func() #此時執行的是inner 舉例造人 def wrapper(fn): def inner(): print('澆水') fn() print('睡一覺') return inner def zaoren(): print('捏個泥人') print('吹口仙氣') print('你就出來了') zaoren = wrapper(zaoren) zaoren() 同一個函數被多個裝飾器裝飾 @wrapper1 @wrapper2 @wrapper3 def func(): pass 1 2 3 func 3 2 1 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 ##1111111 3333333 555555 我是可憐的func 666666 44444444 2222222 帶參數的裝飾器(難受) def wrapper_out(參數): def wrapper(fn): def inner(*args, **kwargs): # 聚合 在目標函數之前 ret = fn(*arg, **kwargs) # 打散 在目標函數之後 return ret return inner return wrapper @wrapper_out(實參) # 執行的時候. 先執行函數的調用然後使用返回值和前面的@組合成裝飾器語法糖 def func(): pass eval => 文件操作 裝飾器 函數 開始舉例 def wrapper(fn): def inner(*args, **kwargs): print('問問金老闆,行情怎麼樣啊') ret = fn(*args, **kwargs) print('金老闆騙我,恨你') return ret return inner def yue(): print('走啊,約不?') yue = wrapper(yue) yue() 進行判斷 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 yue(): # 被 wrapper裝飾 print("走啊. 約不?") yue()