python裝飾器的簡單應用
阿新 • • 發佈:2018-12-18
在Python的函式中,函式的引數我們成為形式引數,想比較而言,預設引數在實際的應用中更加豐富,還有一種情況就是函式的引數是函式,特別是在介面自動化測試中經常應用到這一思想。函式的返回值在一定程度上來說就是為了給另外一個函式提供函式執行的引數而已,這是它的意義,不管在函式中是否編寫return函式它都是有返回值的。函式的引數是函式,這句話可以拿介面測試的一個案例作為說明,比如登入成功後,會返回token,那麼另外一個請求的需要和登入成功後的token一致,否則就返回登入無效,說的簡單點,就是另外一個請求需要使用到登入成功後的token的值,那麼登入中可以返回,並且當引數一樣給另外一個函式執行,來看一個簡單的例項程式碼:
def login(username,passwd): if username=='wuya' and passwd=='admin': return 'ma5QmSCrnZnzqCJ98fd1540130490175' def order(token): if token=='ma5QmSCrnZnzqCJ98fd1540130490175': return '訂單的資料' else: return '登入無效' if __name__ == '__main__': print(order(login('wuya','admin')))
執行後的結果如下圖所示:
針對如上的一個案例,通過裝飾器對程式碼進行改造下,見構造後的原始碼:
def login(func): def getToken(*args,**kwargs): r=func(*args,**kwargs) if r: return r return getToken @login def order(username,password): if username=='wuya' and password=='admin': return '訂單的資料' else: return '登入無效' if __name__ == '__main__': print(order('wuya', 'admin'))
再次執行如上的程式碼,見執行後返回的結果如下圖所示:
這裡就是一個裝飾器的簡單應用,檢視訂單的資料必須要進行登入系統成功後才可以檢視,否則就返回登入無效(訪問頁面直接跳轉到登入的頁面)。這是產品的設計方式,執行order()函式後,函式執行的順序為:
-
執行函式login並把order當作函式login的引數來使用
-
login函式的返回值重新賦值給order函式
-
呼叫函式order其實執行的是getToken函式的,原來的order函式被覆蓋
-
函式一旦使用裝飾器後,被裝飾的函式重新賦值成裝飾器的內部函式(也就是order函式被getToken函式被賦值)
見函式執行的順序截圖:
見login函式的返回值重新賦值給了order函式截圖:
見呼叫order函式實際賦值給裝飾器內部函式getToken函式截圖: