python 裝飾器的詳解和使用

2021-10-05 18:24:54 字數 2925 閱讀 2420

裝飾器就是 @函式名 ,加在被裝飾函式之前。有時候我們需要對函式功能進行擴充套件,但是又必須遵守開閉原則(ocp),不能修改函式,這時候就需要使用裝飾器。

事實上,當我們想要擴充套件函式功能或者修改函式時,直接修改函式中的某幾行**就可以實現。

但是這是有弊端的。

綜合以上三點,這裡我們使用裝飾器就再好不過了。

直接舉個例子,給每乙個函式在執行前,列印出該函式的名字。

首先看一下沒有裝飾器的話,我們怎麼實現?

def

add(

*arg)

:print

(f'的和是'

)def

print_self

(func)

:def

bedeco

(*arg)

:print

(f'我是函式^-^'

) func(

*arg)

return bedeco

f = print_self

f(add)(1

,2,3

)'''

out:

我是add函式^-^

(1,2

,3)的和是6

整個流程是這樣的:

首先定義乙個函式,把需要被裝飾的函式作為引數接受。然後定義乙個內部函式,加上我們裝飾的內容,同時呼叫被裝飾的函式,實現其功能,還要把這個函式作為返回值return。(注意不同函式的引數不盡相同,這裡用不定長引數*args,**kwargs進行統一)

裝飾是完成了,但是使用起來過於繁瑣。

再來看看裝飾器怎麼實現:

def

print_self

(func)

:def

bedeco

(*arg)

:print

(f'我是函式^-^'

) func(

*arg)

return bedeco

@print_self

defadd

(*arg)

:print

(f'的和是'

)add(1,

2,3)

'''out:

我是add函式^-^

(1, 2, 3)的和是6

'''

同樣的結果,只需要在被裝飾函式的定義前面加上裝飾器即可。

事實上,在呼叫被裝飾函式add之前,add已經變成了print_self(test),也就是裝飾器的返回值bedeco。之後在呼叫add時,add()就相當於bedeco()了,執行的時裝飾器的內部函式。

這裡我們可以舉個例子來試驗一下:

def

deco1

(func)

:def

excute()

:return

"《裝飾1 "

+func()+

"裝飾1 >"

return excute

defdeco2

(func)

:def

excute()

:return

"《裝飾2 "

+func()+

"裝飾2 >"

return excute

@deco1

@deco2

defhello()

:return

'hello world'

hello(

)'''

out:

'《裝飾1 《裝飾2 hello world裝飾2 >裝飾1 >'

'''

這裡我認為真相只有乙個,那就是離被裝飾函式近的裝飾器先裝飾。

再來驗證一下,這次我多做幾個裝飾器:

def

deco1

(func)

:def

excute()

:return

"《裝飾1 "

+func()+

"裝飾1 >"

return excute

defdeco2

(func)

:def

excute()

:return

"《裝飾2 "

+func()+

"裝飾2 >"

return excute

defdeco3

(func)

:def

excute()

:return

"《裝飾3 "

+func()+

"裝飾3 >"

return excute

defdeco4

(func)

:def

excute()

:return

"《裝飾4 "

+func()+

"裝飾4 >"

return excute

defdeco5

(func)

:def

excute()

:return

"《裝飾5 "

+func()+

"裝飾5 >"

return excute

@deco1

@deco2

@deco3

@deco4

@deco5

@deco5

defhello()

:return

'hello world'

hello(

)'''

out:

'《裝飾1 《裝飾2 《裝飾3 《裝飾4 《裝飾5 《裝飾5 hello world裝飾5 >裝飾5 >裝飾4 >裝飾3 >裝飾2 >裝飾1 >'

'''

這次我認為原因顯然易見了。

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...

Python 裝飾器的詳解

現在就來詳細講解一下python的裝飾器!裝飾器的理解比較難,裝飾器的使用用到了閉包,閉包是學習裝飾器的基礎。所以先看閉包 coding utf 8 def fun def fun1 print i am fun1 return fun1 這個地方返回fun1的記憶體位址 if name main ...