問題:我們希望通過函數(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變量。