裝飾器的簡單應用

在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()函數後,函數執行的順序爲:

  1. 執行函數login並把order當作函數login的參數來使用
  2. login函數的返回值重新賦值給order函數
  3. 調用函數order其實執行的是getToken函數的,原來的order函數被覆蓋
  4. 函數一旦使用裝飾器後,被裝飾的函數重新賦值成裝飾器的內部函數(也就是order函數被getToken函數被賦值)

見函數執行的順序截圖:

見login函數的返回值重新賦值給了order函數截圖:

見調用order函數實際賦值給裝飾器內部函數getToken函數截圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章