Python函數系列之裝飾器(三)

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

裝飾器的用途:

  • 引入日誌

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

  • 給函數加入事務的能力

  • 權限校驗

  • 緩存

  • 執行函數前/後的預備或清理功能等

例子:

# -*- 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):

  ......


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