python的帶參裝飾器

2022-06-29 05:18:11 字數 3510 閱讀 8600

又是從做鋪墊開始: 

*文件字串(documentation strings)

def

add(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

在裝飾器呼叫過程中,我們列印出這些函式屬性資訊會發現問題:

def

logger(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...