裝飾器是python中比較重要的一個概念,要理解裝飾器,先理解下變量的作用域、閉包、閉包函數。
簡單用個閉包函數舉例
def func():
v_name = 'hello world'
def function():
print(v_name)
return function
func()
參考下面的執行結果,在func()函數中,創建一個子函數function(),當調用func()的時候,retrun的fcuntion,這樣就會直接去調用子函數function,func中的變量v_name可直接被引用。注意此時return的時候function,並不是function()
裝飾器的應用場景:不改變執行函數,在函數外面再加入某些屬性,這樣就大大增加了函數的擴展性和維護性。比如我想統計每個方法執行下來需要的時間。常規做法就是在每天方法的開始和結尾加上時間函數來統計。但是如果用裝飾器,就簡單多了。只需要新增一個方法如下:
def func(run):
def wrapper():
starttime=time1
run() #執行函數
endtime=time2
return (time2-time1)
return wrapper
@func
def run():
******
其中run就是原函數,我們需要來統計它的執行時間。上面的@func就是裝飾器,可以理解爲run=func(run) ,當執行run()的時間,相當於變成了fun=func(run)().,最後被執行的部分就是wrapper方法了。
引申來,當存在參數的時候,就需要在外面再嵌套一層,參數也傳遞到wrapper中來,簡單的例子如下:
import time
def dd(parameter):
def timer(func):
def wrapper(*args):
print ('time1 is 1',parameter)
func(*args)
print ('now time is 2')
return wrapper
return timer
@dd('bibi')
def test(value):
time.sleep(1)
print (value)
test('ggggg')
上面的執行等價於下面的
import time
def dd(parameter):
def timer(func):
def wrapper(*args):
print ('time1 is 1',parameter)
func(*args)
print ('now time is 2')
return wrapper
return timer
#@dd('12')
te=dd('123')
def test(value):
time.sleep(1)
print (value)
te(test)('value')
箭頭的順序大致就是程序執行的流程,還沒完全理解,所以部分知識點沒有說的很透徹。