python裝飾器模組載入後的若干解釋

2021-09-22 02:35:07 字數 1569 閱讀 9006

2019-05-10

**:

def test(func):

print('start decorate function')

def decorate(*args):

print('function name is ', func)

print('params are ', args)

result = func(args)

return result

return decorate

@test

def f1(one):

print(one)

這個**儲存到register.py檔案中,test是乙個裝飾器,它將被裝飾的函式替換為其內部的decorate(*args)函式。

測試**:

在互動中import register,輸出結果:

>>>start decrorate function

這裡的機制是,python在register模組匯入時,發現了test裝飾器以及test裝飾了f1()函式,於是它開始執行test內部的列印語句,以及執行替換f1()為test內部的deorate()函式,注意這裡進行了兩步操作,列印和替換,換句話說就是(1)執行test內的公共部分,(2)執行函式替換操作。

要注意的是在第二部函式替換中,python進行了隱式的替換,它只是替換,但是沒有執行這個decorate函式,真正要執行這個函式的時候,要等到呼叫f1()的時候,比如

>>>f1('hello")

輸出結果為:

>>>function name is  

>>>params are  ('hello',)

>>>('hello',)

這裡呼叫f1()的時候,python知道它之前已經被替換,於是轉去執行那個替換f1()的函式,也就是decorate

2019-05-11

現在來看看帶引數的裝飾器的情況,這種情況與上面的有所不同

**:

func_list = 

def func_regi(activate=true):

print('hello world')

def decorate(func):

print('start decorate')

if activate:

else:

return func

return decorate

@func_regi(activate=true)

def f2():

print('f2()')

可以看到,@func_regi後面帶了引數,實際上func_regi變成了乙個裝飾器工廠函式,呼叫它將會返回乙個裝飾器,從而修飾被裝飾的函式。

當匯入模組時,import register(這個**在register.py中),可以看到輸出:

>>>hello world

>>>start decorate

很顯然,跟上面第一種情況不一樣,python在載入這樣的模組時發現了f2()被func_regi修飾,於是呼叫了decorate()裝飾器替換了f2(),與此同時,它也執行了decorate函式體。

Python 裝飾器與重要模組

def 裝飾器函式 原函式 pass 裝飾器函式名 語法糖 def 原函式 passimport random print dir random random.randint random.random random.choice 基礎 time import time time.time 獲取時間...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python 模組的載入

不管是用import還是用from mmmm import 的方式匯入模組,當程式執行之後,回頭在看那個儲存著mmmm.py檔案的目錄中,多了乙個檔案 ls mmm mmmm.py mmmm.pyc 在這個目錄下面,除了原來的那個mmmm.py之外,又多了乙個mmmm.pyc檔案,這個檔案不是我寫的...