又是從做鋪墊開始:
*文件字串(documentation strings)
defadd(x, y):
"""this is a function for add
"""#
函式語塊第一句;一般用三引號(因為習慣是多行的文字);可以使用.__doc__訪問;慣例是首寫是大寫字母;
return x+y
print("
name={}\ndoc={}
".format(add.__name__, add.__doc__
))
#列印出:
add(x, y)
doc=this is a function of addition
在裝飾器呼叫過程中,我們列印出這些函式屬性資訊會發現問題:
deflogger(fn):
""""""
print('
begin')
x = fn(*args, **kwargs)
print('
end'
)
return
x
return
@logger
#add = logger(add)
defadd(x, y):
"""this is a function for add
"""return x+y
print("
name={}\ndoc={}
".format(add.__name__, add.__doc__))#
列印出:
原函式物件的屬性都被替換了,而使用裝飾器,我們的需求是檢視被封裝函式的屬性。怎麼解決這個矛盾? ----> 提供乙個函式,將被裝飾函式的屬性拷貝到裝飾函式的屬性內。
#將原函式的__name__,__doc__屬性賦值到新函式的屬性值內
defcopy_properties(src, dst):
dst.
__name__ = src.__name__
dst.
__doc__ = src.__doc__
deflogger(fn):
""""""
print('
begin')
x = fn(*args, **kwargs)
print('
end'
)
return
x
return
@logger
#add = logger(add)
defadd(x, y):
"""this is a function for add
"""return x+y
print("
name={}\ndoc={}
".format(add.__name__, add.__doc__))#
列印出:
name=add
doc=this is a function for add
通過copy_properties()函式,將被裝飾函式的屬性賦值給裝飾函式。在剛了解完裝飾器是對原函式起著增加其額外的功能的作用之後,我們是不是會想到這個copy_properties()函式也可以改造成乙個裝飾
器?copy_properties()函式 --柯里化--> 加上語法糖形成裝飾器
柯里化:
#copy_properties柯里化
defcopy_properties(src):
def_copy(dst):
dst.
__name__ = src.__name__
dst.
__doc = src.__doc__
return
dst
return
_copy
#被裝飾的logger函式
deflogger(fn):
""""""
print('
begin')
x = fn(*args, **kwargs)
print('
end'
)
returnx#
柯里化後copy_propertites的呼叫
return#呼叫
@logger #
add = logger(add)
defadd(x, y):
"""this is a function for add
"""return x+y
print("
name={}\ndoc={}
".format(add.__name__, add.__doc__))#
列印出name=add
doc=this is a function for add
於是就形成了特殊的帶參裝飾器。
#copy_properties柯里化
defcopy_properties(src):
def_copy(dst):
dst.
__name__ = src.__name__
dst.
__doc = src.__doc__
return
dst
return
_copy
#被裝飾的logger函式
deflogger(fn):
帶參裝飾器
""""""
print('
begin')
x = fn(*args, **kwargs)
print('
end'
)
return
x
return#呼叫
@logger #
add = logger(add)
defadd(x, y):
"""this is a function for add
"""return x+y
print("
name={}\ndoc={}
".format(add.__name__, add.__doc__))#
列印出name=add
doc=this is a function for add
根據以上歸納總結帶參裝飾器的特點:
它是乙個函式(copy_properties),
函式作為它的形參(fn),
使用@function_name(引數列表)語法糖方式呼叫(@copy_properties(fn))。
可以看作在裝飾器外層又加了一層函式。
上述的利用帶參裝飾器保持被裝飾函式的屬性不變,在python中functools模組就是這樣處理的。有興趣的可以詳細了解一下functools模組。
無參裝飾器函式和帶參裝飾器函式
python裝飾器 下邊幾個裝飾器帶引數和不帶引數例子詳解 我們都知道,python中函式是可以被當做引數進行傳遞的,所以最直接的裝飾器例項如下 def decorator func 裝飾器函式 print welcome func print end def test print hello wo...
python 裝飾器 dec 帶參與不帶參用法
兩個很常見的例項例項看不懂不要緊,過一遍留個印象,看懂了還看文章作甚 1.在函式上使用裝飾器 宣告乙個裝飾器 defdec fn defd args,kargs print dec d return fn args,kagrs return d dec deftest print test test...
Python 有參裝飾器
由於語法糖 的限制,outter函式只能有乙個引數,並且該才是只用來接收 被裝飾物件的記憶體位址 def outter func func 函式的記憶體位址 def args,kwargs res func args,kwargs return res outter outter index def...