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檔案,這個檔案不是我寫的...