Python 閉包和裝飾器學習

2021-09-05 09:30:06 字數 1483 閱讀 2614

def out_func(func):

"""functools.wraps 可以將原函式物件的指定屬性複製個包裝函式物件

"""@functools.wraps(func)

def inner_func(func, *args, **kwargs):

return func()

return inner_func

@out_func

def foo():

print("hello,world")

在不違反開放封閉的原則下,對被裝飾的函式進行功能擴充

實質:閉包

帶來的問題:被裝飾函式名稱等屬性變為閉包的內函式,使用 functools.wraps 可以將原函式物件的指定屬性複製個包裝函式物件

flask 中 g 變數貫穿當前的這次請求

面試中問到裝飾器的時候:

先回答概念:不違反開放封閉原則下,對被裝飾的函式進行功能擴充

聊到閉包,說出閉包中的概念和形式

說道專案中的實際使用:在 flask 中 user 物件用到的地方很多,就單獨寫出來為乙個裝飾器,將 user 物件查詢出來,放到 g 變數中

在 flask 中,每個 url 物件乙個函式,但是被裝飾完,引用指向就變了,使用 functools.wraps 將引用指向原來的指向

閉『包在**中的表現形』式

函式巢狀

內函式使用了外函式的區域性變數

外函式返回的內函式的引用

內函式的引用和外函式被使用的區域性變數構成的特殊空間——閉包

閉包的延遲繫結,當外函式準備返回內函式的引用的時候,發現內函式使用了外函式的區域性變數,就將內函式引用和區域性變數繫結形成特定空間,這種繫結稱為延時繫結

def

multipliers()

:return

[lambda x : i*x for i in

range(4

)]print

([m(2)

for m in multipliers()]

)# 上面的**和下面的一樣

defmultipliers()

: list_funcs =

for i in

range(4

):definner

(x):

return i * x

return list_funcs

print

([m(2)

for m in multipliers()]

)

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