Python閉包和裝飾器

2021-10-05 22:20:53 字數 2068 閱讀 5516

閉包

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 修改外層函式的值,並且內部函...