python 函式修飾符

2021-10-05 07:49:58 字數 1837 閱讀 6275

def log(func):

print('log開始 ...')

func()

print('log結束 ...')

#如果log函式返回乙個字串,test就是乙個字串了

print('test ..')

輸出:

log開始 ...

test ..

log結束 ...

可見,test函式被替換了,但是其"__name__"屬性也變了。

替換以後函式的一些屬性改變了,如"__name__",可以使用functools.wraps函式來避免改變:

from functools import wraps

def 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 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。大資料 人工智慧時代首選程式...