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

在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):

  ......

相關文章
相關標籤/搜索