閉包(setter、getter) --訪問定義在閉包內(nèi)的變量

問題:我們希望通過函數(shù)來擴(kuò)展閉包,使得在閉包內(nèi)層定義的變量可以別訪問和修改

一般來說,在閉包內(nèi)存定義的變量對(duì)于外界來說是完全隔絕的。
但是,可以通過編寫存取函數(shù)(acessor function,即getter/setter方法)并將它們作為函數(shù)屬性附加到閉包上,來提供對(duì)內(nèi)存變量的訪問支持

def sample():
    n = 0
    # 閉包
    def func():
        print('n=', n)

    # 存取函數(shù)
    def get_n():
        return n

    def set_n(value):
        nonlocal n  # 聲明n是函數(shù)內(nèi)層變量
        n = value

    # 將get_n/set_n作為函數(shù)屬性綁定到func上
    func.get_n = get_n
    func.set_n = set_n

    return func

# 使用示例:
f = sample()
f()  # n= 0
f.set_n(10)
print(f.get_n())  # 10
總結(jié):

1、nonlocal聲明使得編寫函數(shù)來修改內(nèi)層變量成為可能;
2、函數(shù)屬性能夠?qū)⒋嫒『瘮?shù)以直接的方式附加到閉包函數(shù)上,它們工作起來很像實(shí)例的方法;
3、閉包訪問變量比實(shí)例變量的直接訪問要快些,因?yàn)樗簧婕邦~外的self變量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容