什麼是裝飾器:
是一個修飾函數把原函數包裹在裝飾函數中,並且改變原函數的行爲但原函數本身不變。(可類比生活中同一個人要拍結婚照了需要多套衣服,每套衣服是變的,都需要重用參與者肉身並不能改變肉身,那麼就通過衣服把肉身包裹起來,然後完成各組拍照。衣服就是裝飾,怎麼實現換衣服並完成拍照就是裝飾器的作用)
函數裝飾器實例
import functools
def decorator(func): # 函數作爲參數傳入
@functools.wraps(func) # 解決原函數被替換爲test函數問題
def test(*args,**kwargs): #*args,**kwargs 不知道傳入的參數類型和數量,定義一個泛型
print '-----------------------' #在源函數前添加裝飾操作
func(*args,**kwargs) #在修飾函數中調用原函數
print '=======================' #在源函數後添加裝飾操作
return test #閉包
@decorator #裝飾器調用語法糖
def testfunc(param,param1): #原函數
print "base func : " + param +" : "+ param1
testfunc('hahaha','22222222222')
print testfunc.__name__ #輸出原函數的名字testfunc
執行結果
-----------------------
base func : hahaha : 22222222222
=======================
testfunc
類裝飾器實例
class test:
def __init__(self,func):
self.func = func
self.num_calls =0
print '1111111111111111111111'
def __call__(self, *args, **kwargs):
print ">>>>>>>>>>111"
self.num_calls +=1
print ('num is :' + str(self.num_calls))
return self.func(*args,**kwargs)
class test2:
def __init__(self,func):
self.func = func
self.num_calls =0
print '2222222222222222222'
def __call__(self, *args, **kwargs):
print '=============222222222222222'
self.num_calls +=10
print ('num is :' + str(self.num_calls))
return self.func(*args,**kwargs)
@test
@test2
def example():
print "aaaaaaaaaaaa"
example()
調用結果:
2222222222222222222
1111111111111111111111
>>>>>>>>>>111
num is :1
=============222222222222222
num is :10
aaaaaaaaaaaa
理解基礎:
1 函數是對象,函數可以賦值給變量
2 函數可以作爲參數傳入另一個函數中
3 函數嵌套,函數中定義函數
4 閉包,return 返回值是函數對象
5 @語法糖
6 實用場景:1 認證 2 日誌處理 3數據校驗 4單元測試時初始化和清理數據 5 併發、控制計數 等等來重用代碼但是不去改動重用塊的本身