前言:在python中,閉包是一種非常有用的功能!它通常與裝飾器一起搭配使用,可以在不改變被裝飾函式的功能的基礎上,完成更多的功能。如許可權認證。
一、如何定義閉包
1.閉包就是兩個巢狀的函式,外層函式返回內層函式的引用,而且外層函式必須攜帶引數!為什麼外層函式必須要有引數呢?可以思考一下!
基本格式如下:
12.與普通函式的區別:defouter_fun(func):
2def
inner_fun():
3pass
4return inner_fun
閉包的外層函式的變數可以在記憶體中儲存著,有點像類;而普通函式一旦執行完,那麼就要**記憶體。
3.萬能閉包
def二、裝飾器outer_func(func):
def inner_func(*args, **kwargs):
func(*args, **kwargs)
return inner_func
1.什麼是裝飾器:@閉包的外層函式名
2.裝飾器的作用:不修改被裝飾函式的功能外,再通過閉包的方式新增額外的功能!
3.基本結構:
1重點:上述**的第七行和第八行是重點,看到這個語法糖要想到其本質: test = outer_func(test)defouter_func(func):
2def
inner_func():
3pass
4return
inner_func56
7@outer_func # test = outer_func(test)
8def
test():
9pass
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)還是返回內層函式的引用。
12.執行流程:defset_args(args):
2def
outer_fun(func):
3def inner_fun(*args, **kwargs):
4 func(*args, **kwargs)
5return
inner_func
6return outer_fun
1 @set_args('(1).先執行@右邊的函式,即先執行set_args('123'),123')2
deftest():
3print('
test')
45 test()
(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 ...