首先理解Python的函數能像普通的對象一樣能作為參數傳遞給其他函數,可以被賦值給其他變量,可以作為返回值,可以被定義在另外一個函數內。
前面的文章已經對閉包做了介紹,再次進行延伸和理解一下裝飾器,主要用于不在改變源代碼的情況下進行添加功能,裝飾器利用閉包來實現,一般和閉包一起使用。
裝飾器返回一個函數對象,簡單理解在原函數功能上又加入新功能并返回一個和原函數名相同的函數對象。
def funcout(func):
def funcIn(x,y):
func(x,y)#外部函數傳入的參數test函數在內部函數的調用
addf()#新增功能函數
return funcIn
#閉包 外部無法直接訪問內部函數 將一個函數當成參數傳遞進來 funcout(test)調用時返回一個函數對象 用一個變量接收函數對象的地址比如假設為ss
#ss(1,2) 調用的內部函數 func是傳進來的函數test 此時func調用傳入的函數 test需要兩個參數 需要在內部函數中傳參
def addf():
print("新增功能")
def test(a,b):
print("a=%s,b=%s"%(a,b))
ff =funcout(test)
ff(1,2)#調用函數
在上面代碼將函數test 進行替換成下列調用方式 就是加了一個@符號 實現裝飾器寫法更簡單
@funcout # 裝飾器 相當于 test=func(test)
def test(a,b):
print("a=%s,b=%s"%(a,b))
test(1,2)#調用函數test 為裝飾器的函數 增加新的功能之后的test
通用裝飾器函數 對可變參數的處理
def funcout(func):
def funcIn(*args,**kwargs)
func(*args,**kwargs) #沒有返回值時使用
addf()
return funcIn(*args,**kwargs) #內部函數的返回值 防止傳入的函數有返回值 有返回值時使用
return funcIn
還可以定義多個裝飾器 執行順序是從里到外的。
@a
@b
@c
def f ():
等效于 f = a(b(c(f)))
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
