def log(func):
print('log開始 ...')
func()
print('log結束 ...')
#如果log函式返回乙個字串,test就是乙個字串了
print('test ..')
輸出:
log開始 ...
test ..
log結束 ...
可見,test函式被替換了,但是其"__name__"屬性也變了。
替換以後函式的一些屬性改變了,如"__name__",可以使用functools.wraps函式來避免改變:
from functools import wrapsdef log(func):
@wraps(func, assigned=('__name__',), updated=('__dict__',)) #這裡後兩個引數需要加逗號,用於表示元組tuple, 否則成字串了,就不對了。
print('log開始 ...',func.__name__)
ret = func(*args,**kwargs)
print('log結束 ...')
return ret
@log
def test1(s):
print('test1 ..', s)
return s
@log
def test2(s1, s2):
print('test2 ..', s1, s2)
return s1 + s2
test1('a')
test2('a','bc')
print(test1.__name__)
log開始 ... test1
test1 .. a
log結束 ...
log開始 ... test2
test2 .. a bc
log結束 ...
test1
可見"__name__"屬性還是「test1」
from functools import wraps
def log(arg): #第一層,帶乙個引數,這個引數就是@的時候的引數
@wraps(func)
print('log開始 ...',func.__name__, arg)
ret = func(*args,**kwargs)
print('log結束 ...')
return ret
return _log
def test1(s):
print('test1 ..', s)
return s
@log('module1')
def test2(s1, s2):
print('test2 ..', s1, s2)
return s1 + s2
test1('a')
test2('a','bc')
輸出:
log開始 ... test1 module1
test1 .. a
log結束 ...
log開始 ... test2 module1
test2 .. a bc
log結束 ...
總之,@叫做函式修飾符,也可以看做包裝一下,用@後面的函式,包裝緊接著定義的函式。
這樣,以後呼叫被包裝函式時,就替換成@後面的函式了。
這種技術可以使用在除錯、測試、記錄和額外事務處理中。
當不需要的時候,可直接注釋掉@語句。
python 修飾符 python 修飾符
修飾符基礎 閉包 什麼是閉包呢?標準的概念大家可以看wikipedia上的解釋 舉個例子 def do add base def add increase return base increase return add do add函式裡巢狀了乙個內層函式add,這個內層函式就是乙個閉包,其實可以也...
python 修飾符 python訪問修飾符
許可權訪問 偽許可權,只是壓縮時按規則換了變數名,python 的哲學是假定使用者都會使用 xx 以單下劃線開頭的表示的是protected型別的變數。即保護型別只能允許其本身與子類進行訪問。若內部變數標示,如 當使用 from m import 時,不會將以乙個下劃線開頭的物件引入 成俗約定,不做...
python修飾符用法 python修飾符
乾貨大禮包!21天帶你輕鬆學python 文末領取更多福利 本課程來自於千鋒教育在阿里雲開發者社群學習中心上線課程 python入門2020最新大課 主講人姜偉。21天帶你輕鬆學python python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。大資料 人工智慧時代首選程式...