從對象的角度看python閉包與裝飾器

從對象的角度看python閉包與裝飾器
閉包
理解:主要的兩個詞:自由變量和函數。一個閉包就是你調用了一個a函數,這個a函數返回了一個b函數給你,這個返回的函數b就叫閉包。在調用函數a的時候傳遞的參數就是自由變量。
例如:

def func(name):
	def inner_func(age):
        print(‘name:’,name,’age:’,age)
    return inner_func
bb=func(“the5fire”)
bb(26)

這裏面調用func的時候就產生了一個閉包,inner_func,並且該閉包持有自由變量name,因此也意味着,當函數func的生命週期結束之後,name這個變量依然存在,他被閉包引用了,所以不會被收回。
目的:幫助我們來完成一個通用的功能。閉包和類相似,都是對數據的封裝,但是閉包本身就是個方法。和類一樣,編程時會把通用的東西抽象成類,以複用通用的功能。閉包也是一樣,當我們需要函數顆粒度的抽象時,閉包就是一個很好的選擇。
定義:在函數中可以(嵌套)定義另一個函數時,如果內部函數引用了外部函數的變量,則可能產生閉包。閉包可以用來在一個函數與一組“私有”變量之間創建關聯關係。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。
使用場景:1、閉包和裝飾器的嵌套。2、惰性求值(表達式不在它被綁定到變量後就立即求值,而是在該值被取用的時候求值,參考迭代器,range等。python中待求證是否是所有表達式都是如此。)3、需要對某個函數的參數提前賦值的情況(還處於懵逼中,並不理解哪個函數不能提前賦值的。)使用場景來自:https://www.the5fire.com/closure-in-python.html
傳參:閉包函數相對於普通函數會多出一個__closure__的屬性,裏面定義了一個元組用於存放所有的cell對象,每個cell對象一一保存了這個閉包中所有的外部變量。
https://betacat.online/posts/2016-10-23/python-closure/

裝飾器
通俗理解:是對函數的一種包裝,能使函數的功能得到擴充,而同時不用更改函數的本身的代碼,可以增加函數執行前、執行後的行爲。
裝飾器可以理解爲另類的閉包,因爲函數結構體是類似的,所以在閉包和裝飾器嵌套的時候,比較容易搞混。裝飾器的難點並不在於它的目的性,而在它的執行順序和語法糖規則(不改原函數,不僅包括函數體,還有函數的調用,總之凡是修改了原函數的,那就不是裝飾器了)。
http://developer.51cto.com/art/201807/579489.htm
運行時間:裝飾器的一個關鍵特性是,它們在被裝飾的函數定義之後立即運行。而被裝飾的函數只在明確調用時運行。
使用場景:https://www.jianshu.com/p/3e4000e34bdd

總結:
從對象的角度看閉包和裝飾器,需要對閉包和裝飾器結合起來,最好理解幾個嵌套,這兩個點概念會在腦瓜裏更清晰。單憑語言介紹是沒有多少用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章