1. 程式人生 > 實用技巧 >Python深度學習入門

Python深度學習入門

裝飾器

什麼是裝飾器:

裝飾器本質上是一個Python函式,它可以讓其他函式在不需要做任何程式碼變動的前提下增加額外功能,裝飾器的返回值也是一個函式物件。它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同程式碼並繼續重用。

概括的講,裝飾器的作用就是為已經存在的函式或物件新增額外的功能

語法:@

1.裝飾器的原型

def printInfo():
   print("我是一個普通的函式")

printInfo()

如何在不允許修改printInfo函式的前提下,在執行printInfo函式前進行許可權校驗;執行後進行日誌記錄。

def check(func):

   def checkAndLog():
      print("函式執行前:許可權校驗")
      func()
      print("函式執行後:日誌記錄")
   return checkAndLog       #返回內部函式

def printInfo():
   print("我是一個普通的函式")

# printInfo()

newFunc = check(printInfo)
newFunc()        #執行內部函式

2.裝飾器的定義和呼叫

#裝飾器函式定義
def check(func):

   def checkAndLog():
      print("函式執行前:許可權校驗")
      func()
      print("函式執行後:日誌記錄")
   return checkAndLog       #返回內部函式(包裝過的函式)
@check    #定義裝飾器修飾的位置,用來修飾誰,相當於check(printInfo)
def printInfo():
   print("我是一個普通的函式")

printInfo()#執行函式前,會先執行裝飾器

3.裝飾器的巢狀

def zs1(func):
   def f():
      print("我是裝飾器1,我來啦")
      func()
      print("我是裝飾器1,我走啦")
   return f
def zs2(func):
   def f():
      print("我是裝飾器2,我來啦")
      func()
      print("我是裝飾器2,我走啦")
   return f

@zs2
@zs1      #自下而上逐步修飾,zs2會把zs1返回的函式進行修飾,一層套一層
def printInfo():
   print("我是一個普通的函式")

printInfo()

4.帶引數的裝飾器

如果原函式帶有引數,那麼返回的包裝後的新函式也要帶有引數,且引數需要一一對應

def tool(func):
   def log(name,pwd):       #如果log不傳入引數,func將接收不到引數
      print(f"日誌記錄【{name}:{pwd}】")
      func(name,pwd)
   return log       #返回包裝過的函式
@tool
def login(name,pwd):
   print(f"使用者名稱:{name},密碼:{pwd}")

login("admin",123456)

5.帶返回值的裝飾器

返回值和原函式定義時相同

def tool(func):
   def log(name,pwd):       #如果log不傳入引數,func將接收不到引數
      print(f"日誌記錄【{name}:{pwd}】")
      state = func(name,pwd)
      return state
   return log       #返回包裝過的函式
@tool
def login(name,pwd):
   print(f"使用者名稱:{name},密碼:{pwd}")
   if name == "admin" and pwd == 123456:
      return "登陸成功"
   return "登入失敗"


res = login("admin",123456)
print(res)

6.定義通用的裝飾器

增加裝飾器的適用性

def tool(func):
   def log(*args,**kwargs):			#通過使用可變引數來增加裝飾器的適用性
      print("日誌記錄前。。。")
      state = func(*args,**kwargs)
      print("日誌記錄後。。。")
      return state
   return log       #返回包裝過的函式

@tool
def test():
   print("我是一個測試函式")

@tool
def login(name,pwd):
   print(f"使用者名稱:{name},密碼:{pwd}")
   if name == "admin" and pwd == 123456:
      return "登陸成功"
   return "登入失敗"


res = login("admin",123456)
print(res)
test()