閉包
def outer():
a = 1
def inner(): #inner是乙個閉包
print(a) #不用a就是乙個巢狀函式
print(inner.__closure__) #出現cell就是乙個閉包
return inner
inn = outer()
inn()
可以節省資源
裝飾器的原則
傳入的物件作為引數,其實傳遞的就是那個物件的記憶體位址
def func(): #被裝飾的函式
time.sleep(10)
print()
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #別裝飾的函式 可以包括整個世界
end = time.time()
return ret
return inner #如果在這裡執行將會出現 none 將會報錯
func = timer(func) #加上 @timer
ret = func() #這個執行的就相當於執行inner()
print(ret)
#帶引數函式的裝飾器
@timer func = timer(func)
def func(a): #被裝飾的函式
time.sleep(10)
print()
ret = func(a) #此時的func已經是內部的物件了,稱為了inner物件
開放封閉原則
語法糖: @timer
最多有三層
def timer_out(flag):
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs) #別裝飾的函式 可以包括整個世界
end = time.time()
return ret
return inner #如果在這裡執行將會出現 none 將會報錯
return timer
flag = true
@timer_out(flag) #先執行 timer_out(flag) == timer -> func = timer(func) ->func() = inner()
def func(a): #被裝飾的函式
time.sleep(10)
print()
func()
多個裝飾器裝飾乙個函式
def timer(f):
def inner(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
return ret
return inner
def timer1(f):
def inner1(*args,**kwargs):
start = time.time()
ret = f(*args,**kwargs)
end = time.time()
return ret
return inner
@timer # func = timer(func) = timer(inner1) == inner2
@timer1 #先找最近的裝修器: func = timer1 = inner1
def func(a): #被裝飾的函式
time.sleep(10)
print()
func()
執行的像js中的冒泡一樣,先進去後出來
python裝飾器和閉包
下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...
python閉包和裝飾器
要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...
python 閉包和裝飾器
閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...