Try   HackMD

Python AOP切面導向程式設計

什麼是 AOP

AOP,就是面向切面導向程式設計,簡單的說,就是動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。

我們管切入到指定類指定方法的程式碼片段稱爲切面,而切入到哪些類、哪些方法則叫切入點。這樣我們就可以把幾個類別共有的程式碼,抽取到一個切片中,等到需要時再切入物件中去,從而改變其原有的行爲。

這種思想,可以使原有程式碼邏輯更清晰,對原有程式碼毫無入侵性,常用於像權限管理,日誌記錄,事物管理等等。

而 Python 中的裝飾器就是很著名的設計,常用於有切面需求的場景。

類如,Django 中就大量使用裝飾器去完成一下切面需求,如權限控制,內容過濾,請求管理等等。

裝飾器

Python 裝飾器(fuctional decorators)就是用於拓展原來函式功能的一種函式,目的是在不改變原函式名或類名的情況下,給函式增加新的功能。

函式裝飾器

比如,我們要在函式執行前和執行後分別執行一些別的操作,那麼根據上面函式可以作爲參數傳遞,我們可以這樣實現,看下面範例:

def c(func):
    def b():
        print('在函式執行前,做一些操作')
        func()
        print("在函式執行後,做一些操作")
    return b

@c
def a():
    print("I'm a")

a()


# 輸出結果:
在函式執行前,做一些操作
I'm a
在函式執行後,做一些操作

如果函式有回傳值,那裝飾器函式也必須有回傳值,例如:

def c(func): def b(): print('在函數執行前,做一些操作') result = func() print("在函數執行後,做一些操作") return result return b @c def a(): print("函式執行中。。。") return "I'm a" print(a()) # 輸出結果: 在函式執行前,做一些操作 函式執行中。。。 在函式執行後,做一些操作 I'm a

如果函式有參數,那裝飾器函式也必須加上參數:

def c(func): def b(name, age): print('在函式執行前,做一些操作') result = func(name, age) print("在函式執行後,做一些操作") return result return b @c def a(name, age): print("函式執行中。。。") return "我是 {}, 今年{}歲 ".format(name, age) print(a('Amos', 24)) # 輸出結果: 在函式執行前,做一些操作 函數執行中。。。 在函式執行後,做一些操作 我是 Amos, 今年24

經過裝飾器裝飾後的函式a,實際上已經變成了裝飾器函式 c 中定義的函式 b