裝飾器就是 @函式名 ,加在被裝飾函式之前。有時候我們需要對函式功能進行擴充套件,但是又必須遵守開閉原則(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 ...