裝飾器模式不用多說,記錄一下python中裝飾器的用法。python
1,裝飾器其實就是一個以函數做爲參數並返回一個替換函數的可執行函數。簡單的來講,就是把須要裝飾的方法的外部增長一個新的功能:閉包
import time
def deco_func(func):
start_time = time.time()
func()
end_time = time.time()
print "Total %d" % (end_time - start_time)
def __func():
print "Start!"
time.sleep(1)
print "End!"
deco_func(__func)
在這段代碼中,咱們將__func方法做爲一個參數傳到了裝飾器裏,增長上了統計執行時間的功能之後,就結束了,雖然勉強完成了裝飾的功能,但並不完美,充其量只是利用了python 函數爲對象的方式簡易完成了裝飾,由於執行了deco_func之後,
__func直接被執行了,並且並非一個方法。
import time
def deco_func(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print "Total %d" % (end_time - start_time)
return wrapper
def __func():
print "Start!"
time.sleep(1)
print "End!"
func = deco_func(__func)
func()
在以上代碼中,依然是把__func方法當作對象傳入了裝飾方法中,可是裝飾方法中包含了一個wrapper的閉包函數,利用wrapper封裝了新的功能之後,將這個方法當作參數返回,而且當其封裝完成之後並無直接被執行,而是真正執行的時候才觸發了功能。
但,上面的代碼仍是不夠完美,由於至關於咱們在每個使用__func的代碼中,可能都須要寫一個封裝而後再調用,仍是對原來的代碼進行了修改。
def deco_func(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print "Total %d" % (end_time - start_time)
return wrapper
@deco_func
def __func():
print "Start!"
time.sleep(1)
print "End!"
這就是python中對裝飾器的終極解決方案,利用了@語法糖,但@了方法之後,之後任何的
func()調用,都至關於執行了
func = deco_func(__func)
func()
接下來再貼兩個帶參數裝飾器和不定參數裝飾器的用法
固定參數
def deco_func(func):
def wrapper(a, b):
start_time = time.time()
func(a, b)
end_time = time.time()
print "Total %d" % (end_time - start_time)
return wrapper
@deco_func
def __func(a, b):
print "Start!"
# time.sleep(1)
print a + b
print "End!"
__func(1, 2)
不定參數
def deco_func(func): def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() print "Total %d" % (end_time - start_time) # return func(*args, **kwargs) return wrapper@deco_funcdef __func1(a, b): print "Start!" # time.sleep(1) print a + b print "End!"@deco_funcdef __func2(a): print "Start!" # time.sleep(1) print a * 2 print "End!"__func2(1)__func1(1, 2)