在Python中,裝飾器的本質(zhì)就是Python中的一個函數(shù),其來源自Python面向?qū)ο蟆Qb飾器是在函數(shù)調(diào)用之上的修飾。這些修飾僅是當聲明一個函數(shù)或方法的時候,才會被應用額外的調(diào)用。有點類似Java中的AOP(面向方面編程)。同時在設計模式中,還有裝飾器模式,也即是: 裝飾器模式(Decorator Pattern) 允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結構 原則是:不修改被修飾函數(shù)的源代碼,不修改被修飾函數(shù)的調(diào)用方式。

裝飾器的用途:

  • 引入日志

  • 增加計時邏輯來檢測性能

  • 給函數(shù)加入事務的能力

  • 權限校驗

  • 緩存

  • 執(zhí)行函數(shù)前/后的預備或清理功能等

例子:

            #?-*-?coding:?utf-8?-*-

import?time

def?deco(func):?#func?=?test1或test2
????def?wrapper():
????????start_time?=?time.time();
????????func();?#就是運行?test1()或者test2()函數(shù)
????????end_time?=?time.time();
????????print("此模塊運行時間為:%s"?%(end_time?-?start_time));
????return?wrapper;

def?test1():
????time.sleep(3);
????print("函數(shù)Test1運行結束");


def?test2():
????time.sleep(3);
????print("函數(shù)Test2運行結束")

#在沒用使用裝飾器調(diào)用時,如下調(diào)用
test1?=?deco(test1)?#返回的wrapper函數(shù)地址
test1()?#執(zhí)行的wrapper()

test2?=?deco(test2)
test2()

#若上面函數(shù)有上百上千個,都是那樣調(diào)用,都是重復的代碼調(diào)用,在Python中,使用@語法糖

#例如下面定義一個test3函數(shù)
@deco??#就相等于?test3?=?deco(test3)
def?test3():
????time.sleep(3);
????print("函數(shù)Test-3運行結束");
test3()
          

運行結果如下:

函數(shù)Test1運行結束

此模塊運行時間為:3.000406265258789

函數(shù)Test2運行結束

此模塊運行時間為:3.000087261199951

函數(shù)Test-3運行結束

此模塊運行時間為:3.000718355178833


Process finished with exit code 0

裝飾器的語法以@開頭,接著是裝飾器函數(shù)的名字和可選的參數(shù)。緊跟著裝飾器聲明的是被修飾的函數(shù)和裝飾函數(shù)的可選參數(shù)。

例如如下:

@decorator(dec_opt_args)

def func(func_opt_args):

? ......