1. 程式人生 > >python裝飾器與AOP程式設計,個人理解

python裝飾器與AOP程式設計,個人理解

Python裝飾器是一個很出名的設計模式,它主要的功能就是不改變函式已有功能的情況下對函式起到一個錦上添花的作業,使函式的功能更加豐富,在插入日誌,效能測試,快取機制和許可權驗證都是比較好的左右。不同的函式可以使用同一個裝飾器,所以它和函式本身不存在什麼必然的聯絡。

AOP(面向切面程式設計): 下面用一個例子來說明:

假設我們定義了一個函式:

def test():

        print('in test')

test()

這是一個非常簡單的函式,其功能肯定是顯而易見了。

現在我們想測試下這個函式的執行時間成本如何 但是我們又不想去改變函式本來的程式碼 怎麼辦,在Python中程式設計會很大程度上用上面向函式程式設計的思想,這裡我們也不能例外。我們重新定義一個函式。哈哈

def test():        

        print('in test')

def timeit():

        start = time.clock()

        test()

        end = time.clock()

        print('foo is used:', end-start)

timeit()

想一想這一樣的方式我們的確能達到我們一開始的目的,但是假如我現在有另外一函式也需要測試它的執行時間,怎麼辦,是修改我們已有的函式還是進行復制再修改 好像都不是太好,那我們就得想一種比較好的方式,讓程式能夠通用,於是乎,我們就這樣辦,將函式名作為函式引數傳給另一個函式,在另一個函式的內部進行呼叫,

def test():               

        print('in test')

def timeit(func):

        def wrap():

                start = time.clock()

                func()

                end = time.clock()

                print('foo is used:', end-start)

    return wrap

test = timeit(test)

test()

這樣我們們就實現了程式碼的可複用性了啊。我們先呼叫timeit函式並把函式名test作為引數傳給它,它會返回內嵌函式的函式名 將這個返回結果賦值給test變數, 此時我們使用test呼叫的函式就是timeit內部的wrap了啊 這樣就實現了我們的目的了。而從一個函式開始處開始計時和退出時需要計時,這被稱為一個橫切面,這種方式的程式設計我們稱為AOP面向切面程式設計

這裡我們的裝飾器還尚未結束,這樣的呼叫方式太過繁瑣,也比較難看,Python中提供了語法糖來解決這個問題,那麼就是使用@符號對函式進行修飾, 等同上面的語言,這樣看起來也更有裝飾器的感覺,注意需要將裝飾器函式定義在要裝飾的函式之前。

def  timeit(func):        

        def wrap():                

                start = time.clock()                

                func()                

                end = time.clock()                

                print('foo is used:', end-start)    

        return wrap    

@timeit

def test():                              

      print('in test')

test()

相關推薦

python裝飾AOP程式設計個人理解

Python裝飾器是一個很出名的設計模式,它主要的功能就是不改變函式已有功能的情況下對函式起到一個錦上添花的作業,使函式的功能更加豐富,在插入日誌,效能測試,快取機制和許可權驗證都是比較好的左右。不同的函式可以使用同一個裝飾器,所以它和函式本身不存在什麼必然的聯絡。AOP(面

python裝飾之原理實現作用例程

裝飾器的功能 當需要對一段寫好的程式碼新增一段新的需求的時候的時候我們就可以用裝飾器實現。 def set_func(func): def call_funct(): print("---這是許可權驗證1---") print("---這是許可

Python裝飾函數語言程式設計

一、函數語言程式設計 “函數語言程式設計”同“面向物件程式設計”,“面向過程程式設計”一樣是一種程式設計正規化,它屬於”結構化程式設計”的一種,主要思想是把運算過程儘量寫成一系列巢狀的函式呼叫。相比於面向物件,函數語言程式設計的最大優點在於將計算機運算看做是數

Python裝飾面向切面程式設計

今天來討論一下裝飾器。裝飾器是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、效能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函式中與函式功能本身無關的雷同程式碼並繼續重用。概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。 1. 裝

python-裝飾,類對象,私有字段,析構,__call__,繼承,多繼承,接口

裝飾器 類與對象 私有字段 析構 __call__ 繼承 1、裝飾器執行流程裝飾器:將原函數替換為wrapper函數def outer()@outer --- func1作為參數傳入outer()def wrapper() --- wrapper()放入內存return wrapp

python函數下篇裝飾和閉包外加作用域

發揮 作用域 fat 功能 user div 日誌 code 返回函數 裝飾器和閉包的基礎概念 裝飾器是一種設計模式能實現代碼重用,經常用於查日誌,性能測試,事務處理等,抽離函數大量不必的功能。 裝飾器:1、裝飾器本身是一個函數,用於裝飾其它函數:2、功能:增強被裝飾函數的

Python裝飾AOP 不定長參數 鴨子類型 重載(三)

大量 傳遞 items extend rgs gzip rap 遊泳 很多 1 可變長參數與關鍵字參數 *args代表任意長度可變參數 **kwargs代表關鍵字參數 用*args和**kwargs只是為了方便並沒有強制使用它們. 缺省參數即是調用該函數時,缺省參數的值若未

python裝飾生成器

 裝飾器和生成器 裝飾器: def hello(fn):  #1,3    def wrapper (): #4        fn()  

Python 裝飾理解使用

Python裝飾器 本質是函式 為其他函式新增附加功能。裝飾器本身也是Python的一個重點,所以無論如何你必須弄懂它。裝飾器的存在其實就是為了在需要新增新功能時不影響之前版本的使用的同時來增加新功能,其實也是一種“偷懶”的辦法。它的使用場景較多,比如:插入日誌、效能測試、事務處理、快取

Python 裝飾函式 wraps 利用快取查詢原理加速遞迴

# 裝飾器函式 def foo(fn): def wrappers(): print("hello, %s" %fn.__name__) fn() print("bye, %s" %fn.__name__) return wrap

python 裝飾 & 可同時接受有引數無引數的裝飾

昨天下午仔細學習了裝飾器的內容,算是比較明白了。標題的題目來源於這裡 from functools import wraps def log(ft): if not isinstance(ft, str): @wraps(ft) def wra

Python 裝飾帶有引數的裝飾

  demo.py(裝飾器,帶引數的裝飾器): def set_level(level_num): def set_func(func): def call_func(*args, **kwargs): if level_num ==

Python 裝飾@對函式進行功能擴充套件開閉原則

裝飾器可以對原函式進行功能擴充套件,但還不需要修改原函式的內容(開閉原則),也不需要修改原函式的呼叫。   demo.py(裝飾器,@): # 閉包 def w1(func): def inner(): # 對原函式進行功能擴充套件 pr

利用Python裝飾實現鬥地主之洗牌和抓牌效果槓槓的!

from random import sample import random str_L=['2','3','4','5','6','7','8','9','10','J','Q','K','A']

Python 自定義裝飾函式的可變引數

1.函式的可變引數 參考來源 def f(*args, **kw): *:代指元組,長度不限 **:代表鍵值對,個數不限 def f(*args, **kw): print len(args) print args for i in kw:

python裝飾測試理解

第一,裝飾器基礎語句 # 這是一個基本的裝飾器測試檔案 def deco(func): def mod(): func() print("I'm mod") #mod函式在接收的func函式基礎上,後置增加

Python裝飾-面向切面的程式設計AOP2

這幾天花了點時間瞭解了下Python的裝飾器。其實以前在書上也看過有關的內容,不過當時不理解。今天把自己的一點體會寫出來跟大家分享一下。     一、裝飾器能幹啥?     正如 AstralWind 在他的部落格中介紹,“裝飾器是一個很著名的設計模式,經常被用於有

python裝飾限制函式執行時間超時退出

實際專案中會涉及到需要對有些函式的響應時間做一些限制,如果超時就退出函式的執行,停止等待。 可以利用python中的裝飾器實現對函式執行時間的控制。 python裝飾器簡單來說可以在不改變某個函式內部實現和原來呼叫方式的前提下對該函式增加一些附件的功能,提供了對該函式功能

python裝飾一種更容易理解的方式

裝飾器的策略可以這樣來概括,它是對原有函式封閉性的保持,又對原有函式進行擴充套件;就是說對你原有的程式碼不做修改,保證其功能模組不發生改變,在原有函式的基礎上,再加一層,對原有函式進行擴充套件;假如說有這樣一件事情:def printout(num):    print "T

Python裝飾的函數語言程式設計

        Python的修飾器的英文名叫Decorator,當你看到這個英文名的時候,你可能會把其跟Design Pattern裡的Decorator搞混了,其實這是完全不同的兩個東西。雖然好像,他們要乾的事都很相似——都是想要對一個已有的模組做一些“修飾工作”,所謂修