定義: 本質是函數(裝飾其他函數),是為其他函數添加附加功能 本質是函數(裝飾其他函數),是為其他函數添加附加功能 原則: 不能修改被裝飾函數的源代碼 不能修改被裝飾函數的調用方式 實現裝飾器知識儲備: 函數及“變數” 高階函數 嵌套函數 裝飾器 = 高階函數 + 嵌套函數 實際使用方式: 1 #裝 ...
定義:
- 本質是函數(裝飾其他函數),是為其他函數添加附加功能
- 不能修改被裝飾函數的源代碼
- 不能修改被裝飾函數的調用方式
- 函數及“變數”
- 高階函數
- 把一個函數名當做實參傳給另外一個函數(不修改被裝飾函數,為其添加功能)
- 返回值中包含函數名(不修改函數調用方式)用return返回記憶體地址
- 嵌套函數
裝飾器 = 高階函數 + 嵌套函數
實際使用方式:
1 #裝飾器試驗 2 3 import time 4 5 #裝飾器 6 def adron(fun): 7 print('傳入待裝飾函數的記憶體地址:%s'%fun) 8 def ad_x(*args,**kwargs): 9 start_time = time.time() 10 #fun+()的方式來執行被裝飾函數 11 fun(*args,**kwargs) 12 stop_time = time.time() 13 print('visit world use time:%s'%(stop_time-start_time)) 14 return ad_x 15 16 #被裝飾函數 17 @adron # @adron = adron(tet),將tet記憶體地址傳當做參數傳入裝飾器函數 18 def tet(): 19 time.sleep(3) 20 print('hello world!') 21 #這裡tet由裝飾器裝飾後,記憶體地址是ad_x的記憶體地址 22 tet() 23 24 @adron 25 def jsq(n,s): 26 for i in range(n): 27 time.sleep(s) 28 print(i) 29 30 jsq(5,0.1)
高階裝飾器:
1 #大裝飾器 2 3 name = 'sober' 4 password = '123' 5 6 def badn(action): 7 print("登錄方式:%s"%action) 8 #fun 由 @badn裝飾器傳入 9 def bt_badn(fun): 10 print('查看fun值:%s'%fun) 11 def adron(*args,**kwargs): 12 if action == 'local': 13 name_value = input('Please user name:') 14 password_value = input('Please Password:') 15 if name == name_value and password == password_value: 16 #fun 會執行被裝飾函數,因為傳入的fun是被執行函數的記憶體地址 17 ret_value = fun(*args,**kwargs) 18 print('裝飾器內執行被裝飾函數後返回前') 19 #返回被裝飾函數執行後的結果 20 return ret_value 21 else: 22 print('username or password error') 23 elif action == 'ldap': 24 print('ldap is unrealized') 25 #return返回函數名稱,是在返回函數記憶體地址,使用記憶體地址+()的方式調用函數 26 return adron 27 return bt_badn 28 29 30 def index(): 31 print('welcome !hello world!') 32 33 @badn(action='local') # @badn = badn(home) 如果要傳入參數則需要在裝飾器函數內再嵌套一層 34 def home(): 35 print('welcome home path') 36 return 'a' 37 38 @badn(action='ldap') 39 def ldap(): 40 print('welcome ldap enter') 41 42 index() 43 #這裡的執行通過函數記憶體地址+()執行函數 44 #home() 45 print('顯示home返回值:%s'%home()) 46 ldap()
註:學習oldboy python自動化運維——裝飾器篇筆記
代碼內加入了本人對裝飾使用的理解