我們知道,函數內部是可以調用外部的數據的,但是外部的數據無法調用內部的數據
如果一個函數結束,它在其生命週期內所創建的數據都會被銷燬。
但是有的時候,我們卻十分需要一些函數內部的數據得以保存,希望這些數據不管函數是否存在,其都不被銷燬,並且能在以後的多次調用時都能起到記載關鍵信息的作用,但是我們又不想引用全部變量,這就是產生閉包的原因。
閉包:起到函數內外數據交的作用,閉包中的自由變量,遊離於函數之外,長生不老。
這個自由變量,可以使得閉包有很多作用,比如實現單例模式。
工廠裝飾器:爲@語法糖添加參數,並且這個參數可以傳遞給內部函數,如FLASK路由實現
來看看下面的代碼
def factory(route):
print("現在的路徑是這個啊:",route)
def wrapper(func):
list = []
def inner(*args,**kwargs):
print("知道了,是這個路徑,"+ route)
res = func(*args,**kwargs)
if not list:
list.append(route)
print('這個列表爲空,但就這一次哦')
return list,res
return inner
return wrapper
@factory('/index')
def test(page):
return page+'的處理結果'
@factory('/index2')
def test2(page):
return page + '的處理結果'
print(test('index頁面1'))
print(test('index頁面2'))
print(test('index頁面3'))
print(test2('index2頁面1'))
print(test2('index2頁面2'))
print(test2('index2頁面3'))
打印 結果:
現在的路徑是這個啊: /index
現在的路徑是這個啊: /index2
知道了,是這個路徑,/index
這個列表爲空,但就這一次哦
(['/index'], 'index頁面1的處理結果')
知道了,是這個路徑,/index
(['/index'], 'index頁面2的處理結果')
知道了,是這個路徑,/index
(['/index'], 'index頁面3的處理結果')
知道了,是這個路徑,/index2
這個列表爲空,但就這一次哦
(['/index2'], 'index2頁面1的處理結果')
知道了,是這個路徑,/index2
(['/index2'], 'index2頁面2的處理結果')
知道了,是這個路徑,/index2
(['/index2'], 'index2頁面3的處理結果')
Process finished with exit code 0
在這段代碼中,我們可以窺探到小細節:
@的優先級應該是很高的,函數一開始就載入了全部的裝飾器
後期的使用過程中,列表內的變量並沒有被銷燬,這個列表即爲自由變量,即使它是在factory內部
通過這樣的傳遞方法,可以清晰的掌握當前路徑,所需要的參數,並返回處理結果,數據交互,十分靈活。