在Python中,裝飾器的本質就是Python中的一個函數,其來源自Python面向對象。裝飾器是在函數調用之上的修飾。這些修飾僅是當聲明一個函數或方法的時候,纔會被應用額外的調用。有點相似Java中的AOP(面向方面編程)。同時在設計模式中,還有裝飾器模式,也便是:裝飾器模式(Decorator Pattern)容許向一個現有的對象添加新的功能,同時又不改變其結構。原則是:不修改被修飾函數的源代碼,不修改被修飾函數的調用方式。python
裝飾器的用途:編程
引入日誌設計模式
增長計時邏輯來檢測性能緩存
給函數加入事務的能力app
權限校驗ide
緩存函數
執行函數前/後的預備或清理功能等性能
例子:spa
# -*- coding: utf-8 -*- import time def deco(func): #func = test1或test2 def wrapper(): start_time = time.time(); func(); #就是運行 test1()或者test2()函數 end_time = time.time(); print("此模塊運行時間爲:%s" %(end_time - start_time)); return wrapper; def test1(): time.sleep(3); print("函數Test1運行結束"); def test2(): time.sleep(3); print("函數Test2運行結束") #在沒用使用裝飾器調用時,以下調用 test1 = deco(test1) #返回的wrapper函數地址 test1() #執行的wrapper() test2 = deco(test2) test2() #若上面函數有上百上千個,都是那樣調用,都是重複的代碼調用,在Python中,使用@語法糖 #例以下面定義一個test3函數 @deco #就相等於 test3 = deco(test3) def test3(): time.sleep(3); print("函數Test-3運行結束"); test3()
運行結果以下:設計
函數Test1運行結束
此模塊運行時間爲:3.000406265258789
函數Test2運行結束
此模塊運行時間爲:3.000087261199951
函數Test-3運行結束
此模塊運行時間爲:3.000718355178833
Process finished with exit code 0
裝飾器的語法以@開頭,接着是裝飾器函數的名字和可選的參數。緊跟着裝飾器聲明的是被修飾的函數和裝飾函數的可選參數。
例如以下:
@decorator(dec_opt_args)
def func(func_opt_args):
......