自己編寫乙個裝飾器中的裝飾器函式

2022-08-24 07:36:10 字數 1216 閱讀 3099

看了「大道曙光」的《**functools模組wraps裝飾器的用途》的文章。基本上弄清了wraps的工作原理,為了檢驗一下自己理解的程度,於是動手寫乙個類似的 wraps函式,請大家指教。

#***************=測試***************====

debug_log = sys.stderr

def trace(func):

if debug_log :

@mywraps(func)             #把被呼叫函式當作裝飾器函式的引數

def callfile(*args,**kwargs): #callfile 成了裝飾器函式的被呼叫函式

debug_log.write('function name:{}\n'.format(func.__name__))

debug_log.write('function args:{}\n'.format(args))

debug_log.write('callfile name:{}\n'.format(callfile.__name__))

res = func(*args,**kwargs)

return res

return callfile

else:

return func

@trace

def add(x,y):

''' return x+y '''

return x+y

print add(5,6)

print 'func name:',add.__name__

help (add)

#*****====執行結果********************=

function name:add

function args:(5, 6)

callfile name:add

11func name: add

help on function add in module __main__:

add(*args, **kwargs)

return x+y

help on function add in module __main__:

add(x, y)

return x+y

個人理解總結:mywraps 的作用就是裝飾器中的裝飾器,通過在裝飾器中把func的一系列屬性複製給callf,來達到在呼叫被裝飾過的add函式時,add 的屬性還是原來屬性。

乙個裝飾器裝飾乙個函式

2 如果鍵不存在,則新增到字典中。請使用裝飾器來實現,順便複習下 args和 kwargs的用法 a defselect func def inner args,kwargs if len args 0 if kwargs key in kwargs data print 鍵存在 else func...

帶函式的裝飾器 多個裝飾器裝飾乙個函式

一 帶引數的裝飾器 開關 author administrator f true defouter f def wap fun ggdef inner args,kwargs iff print inner before ret fun args,kwargs gg print inner afte...

裝飾器如何裝飾乙個函式

裝飾器如何裝飾乙個函式?今天番茄加速就來講一下。printstar函式接收乙個函式f,返回值也是乙個函式,所以滿足裝飾器的結構要求,所以printstar是乙個裝飾器。def printstar f def g print 20 f print 20 return g printstar裝飾器實現f...