Python高階 閉包與裝飾器

2021-08-20 06:54:45 字數 2545 閱讀 3369

前言:在python中,閉包是一種非常有用的功能!它通常與裝飾器一起搭配使用,可以在不改變被裝飾函式的功能的基礎上,完成更多的功能。如許可權認證。

一、如何定義閉包

1.閉包就是兩個巢狀的函式,外層函式返回內層函式的引用,而且外層函式必須攜帶引數!為什麼外層函式必須要有引數呢?可以思考一下!

基本格式如下:  

1

defouter_fun(func):

2def

inner_fun():

3pass

4return inner_fun

2.與普通函式的區別:

閉包的外層函式的變數可以在記憶體中儲存著,有點像類;而普通函式一旦執行完,那麼就要**記憶體。

3.萬能閉包

def

outer_func(func):

def inner_func(*args, **kwargs):

func(*args, **kwargs)

return inner_func

二、裝飾器

1.什麼是裝飾器:@閉包的外層函式名

2.裝飾器的作用:不修改被裝飾函式的功能外,再通過閉包的方式新增額外的功能!

3.基本結構:    

1

defouter_func(func):

2def

inner_func():

3pass

4return

inner_func56

7@outer_func # test = outer_func(test)

8def

test():

9pass

重點:上述**的第七行和第八行是重點,看到這個語法糖要想到其本質: test = outer_func(test)

4.結論:

(1). 裝飾前的test函式和閉包外層函式的func是一樣的;

(2). 裝飾後的test函式是閉包內層函式的引用,也就是說此時test指向了inner_func函式體;

(3). 裝飾器一般不改變原先函式的行為。

5.裝飾器的乙個小問題

與其說是裝飾器的問題,不如說是閉包的問題!

乙個函式被裝飾之後,它的函式名會發生變化,變成了閉包的內層函式名。那該怎麼解決這個問題呢?

使用funtools.wraps()這個裝飾器就可以完美解決這個問題了,因為這個裝飾器會保留被裝飾函式的一些基本資訊。

1

import

functools23

4def

outer_func(func):5#

使用這個裝飾器,可以保留被裝飾函式的一些基本資訊,如名稱不變

[email protected](func)

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

8 func(*args, **kwargs)910

#inner_func.__name__ = func.__name__

11return

inner_func

1213

14@outer_func

15def test(*args, **kwargs):

16print('

%s 正在執行。。。。

' % test.__name__)17

1819 test()

三、裝飾器記憶體**

1.乙個裝飾器裝飾乙個函式的記憶體**:

2.兩個裝飾器裝飾乙個函式的記憶體**

四、裝飾器傳引數

1.結構:由三層函式構成的,即用乙個函式把閉包給封裝起來,這個函式必須帶有引數!

最外層函式(set_args)返回閉包的外層函式的引用;

閉包的外層函式(outer_fun)還是返回內層函式的引用。

1

defset_args(args):

2def

outer_fun(func):

3def inner_fun(*args, **kwargs):

4 func(*args, **kwargs)

5return

inner_func

6return outer_fun

2.執行流程:    

1 @set_args('

123')2

deftest():

3print('

test')

45 test()

(1).先執行@右邊的函式,即先執行set_args('123'),

(2).執行完set_args()後返回outer_fun的引用,此時就是test = outer_fun(test)這個熟悉的語法了,

(3).接下來就執行被裝飾的函式了。

Python高階 閉包與裝飾器

1.函式引數 1 函式名存放的是函式的位址 2 函式名 存放的是函式內的 3 函式名只是函式 空間的引用,當函式名賦值給乙個物件的時候,就是引用傳遞 def func01 print func01 is show test func01 print func01 print test test 2....

python閉包與裝飾器

首先閉包函式我的理解是,乙個函式內可以巢狀定義乙個函式,並將巢狀定義的函式返回 如果不返回執行完函式物件也就銷毀了 巢狀函式可以接收外部函式的引數,不同引數就可以變更巢狀函式的功能,返回不同功能的巢狀函式物件。以下是閉包函式簡單示例,如果inner函式不接收outer的引數x也就沒有意義了,一定要返...

Python閉包與裝飾器

一.閉包 如果乙個內嵌函式中引用了外部函式中的變數 非全域性變數 那麼該內嵌函式稱之為閉包 也就是將組成函式的語句和這些語句的執行環境打包在一起時,得到的物件 閉包滿足的三個條件 1.必須是內嵌函式 2.外層函式返回值是內嵌函式 3.內嵌函式引用外層函式變數 def funx x def funy ...