Python裝飾器原理分析和案例

2021-08-19 13:30:05 字數 1421 閱讀 9474

裝飾器部分:

裝飾器是可呼叫的物件,其引數是另乙個函式(被裝飾的函式)。裝飾器可能會處理被裝飾的函式,將它返回;或者將其替換成另乙個函式或者可呼叫的物件。

@decorate

def target():

print('running target()')

以上例子,通過裝飾器之後,實際執行的是如下方法:

def target():

print('running target()')

target = decorate(target)

這兩個寫法的最終結果是一樣的,從第二個例子可以更直觀的感受裝飾器的效果。將乙個函式作為乙個引數,輸入到另外乙個函式中。接下來我們看乙個實際的例子。

def demo(func):

def inner():

print('runnging the inner()')

return inner #必須返回函式!!!閉包也是,另外會開一篇講解閉包

@demo

def target():

printing('running the target()')

target =target()

列印結果:running inner()

從上面可以看到,執行的是target()函式,如果沒有裝飾器的情況下,列印的必然是 running target(),但是在裝飾器的作用下,列印了running inner。這個過程其實是把target作為乙個引數輸入到了demo函式,然後順序執行了inner函式,而非target函式。

python 裝飾器的第二個特性:匯入即執行:我們可以看到,當傳入target之後,inner函式實際就執行了。

下面再來看乙個例子:

registry  = 

def register(func):

print('running register(%s)' %func)

return func

@register

def f1():

print('running f1()')

@register

def f2():

print('running f2()')

def f3():

print('running f3()')

def main():

f1()

f2()

f3()

if __name__ == '__main__':

main()

將該檔案作為指令碼,import register匯入模組,即發現[在模組匯入的時候就能夠立即執行,而函式f1,f2(),需要在呼叫的時候,才能被執行。

裝飾器原理分析

實驗一 usr local bin python3 deff name print name defh fun print fun.name defg print jack return fun return g return h f bob def fun1 print fun1 return f...

python裝飾器原理 Python裝飾器原理

裝飾器 decorator 是物件導向設計模式的一種,這種模式的核心思想是在不改變原來核心業務邏輯 的情況下,對函式或類物件進行額外的修飾。python中的裝飾器由python直譯器直接支援,其定義形式如下 decorator def core service 要理解上述 的含義,我們從自定義函式裝...

python裝飾器分析 Python裝飾器舉例分析

概述 裝飾器本質上是乙個python函式,它可以讓其他函式在不需要做任何 變動的前提下增加額外功能,裝飾器的返回值也是乙個函式物件。我們要需要乙個能測試函式執行時間的decorator,可以定義如下 def timer func start time time.time res func args,...