30行代碼讓你徹底理解工廠裝飾器,閉包的原理

我們知道,函數內部是可以調用外部的數據的,但是外部的數據無法調用內部的數據

如果一個函數結束,它在其生命週期內所創建的數據都會被銷燬。

但是有的時候,我們卻十分需要一些函數內部的數據得以保存,希望這些數據不管函數是否存在,其都不被銷燬,並且能在以後的多次調用時都能起到記載關鍵信息的作用,但是我們又不想引用全部變量,這就是產生閉包的原因。

閉包:起到函數內外數據交的作用,閉包中的自由變量,遊離於函數之外,長生不老。

這個自由變量,可以使得閉包有很多作用,比如實現單例模式。

工廠裝飾器:爲@語法糖添加參數,並且這個參數可以傳遞給內部函數,如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內部

通過這樣的傳遞方法,可以清晰的掌握當前路徑,所需要的參數,並返回處理結果,數據交互,十分靈活。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章