軟體開發中有一條非常重要的規則就是:對修改封閉,對擴充套件開放。
對於乙個現有的函式,如果想要增強此函式的功能,但是不允許修改此函式源**的時候,使用裝飾器來解決這個問題
#被修飾的函式
defsay_hello
(name)
:print
('我就是人見人愛,花見花開的%s'
%name)
# 引數是被修飾函式
def(func)
:#1.定義裝飾器
definner
(name)
:#2.定義閉包 在閉包中增加功能
print
('-'*50
) func(name)
#3.呼叫原函式實現原來的功能
print
('*'*50
)return inner #4.返回增強功能的函式
#5.獲取增強功能的函式
say_hello(
'風流小王子'
)#6. 呼叫增強函式,實現功能
使用@語法糖將裝飾器應用到指定函式上,簡化裝飾器的寫法
#用法:在需要被裝飾的函式前面加上: @裝飾器的名字 【外層函式的名字】
def(func)
:def
inner
(age1)
:#增加的功能
if age1 <0:
age1 =
0#呼叫原函式
func(age1)
return inner
defgetage
(age)
:print
(age)
getage(18)
#呼叫增強的函式
注意:使用@的時候,如果裝飾器和需要被裝飾的函式在同乙個.py檔案中的時候,裝飾器一定要出現在被裝飾函式的前面【python中的**是從上往下依次執行的】
同乙個裝飾器可以應用於多個函式
def
(func)
:def
inner
(*tup,
**kw)
:#變長引數
func(
*tup,
**kw)
print
('-'*50
)return inner
deftest1
(a,b)
:print
(a,b)
test1(1,
2)
deftest1
(a):
print
(a)
#多個裝飾器同時作用於乙個函式的時候,要注意一下裝飾器執行順序
def(func)
:print()
definner
(a,b)
:print()
func(a,b)
return inner
def(func)
:print()
definner
(a, b)
:print()
func(a, b)
return inner
deftext
(num1,num2)
:print
(num1 + num2)
text(10,
20)
python中的裝飾器
其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...
Python 中的裝飾器
1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...
python中的 裝飾器
示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...