概念:在一個函數內部再定義一個函數,定義的函數引用外部函數的變量,那么這個定義的函數和變量就叫閉包。
#如果要修改變量,先用nonlocal申明
例子:類定義
class lnfun(object):
? ? ?? def __init__(self,k,b):
? ? ? ? ? ? ? self.k=k
? ? ? ? ? ?? self.b=b
? ? ?? def cal(self,x):
? ? ? ? ? ?? print(self.k*x+self.b) ? ? ? ? ? ? ? ? #較麻煩
例子:裝飾器?
? ? ?? def ?? outer(k,b):
? ? ? ? ? ? ? def? inner(x):
? ? ? ? ? ? ? ? ? ?? print(kx+b) ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ?? return inner ? ? ? ? #使用閉包的優點是代碼精簡
調用:
a=outer(1,2)
a(5)
裝飾器:
概念:在不修改函數功能的基礎上,擴展功能
單層裝飾器:
def outer(fun):
? ? ? def inner():
? ? ? ? ?? print('你真皮')
? ? ? ? ? ? fun()
? ? ? return inner
@outer? ? ? #base_fun=outer(base_fun)
def base_fun():
? ? ? ? ? print('瞅你咋地')
base_fun() ? ? ?? #相當于加了一層裝飾
多層裝飾器:
def out1(fun):
? ? ? ? print('快點吃飯啊')
? ? ? ? def in1():
? ? ? ? ? ? print('那就別吃了')
? ? ? ? ? ? fun()
? ? ? ? return in1
def out2(fun):
? ? ? ? print('不吃飯打你屁屁')
? ? ? ? def in2():
? ? ? ? ? ? ?? print('吃什么好呢')
? ? ? ? return in2
@out1? # eat=out1(eat)
@out2? # eat=out2(eat)
def eat():
print('沒有食欲')
eat()
“”“調用順序:裝飾器裝飾遵循最近原則,理解引用,引用的是in指向的代碼塊。“”“