鍍金池/ 問答/Python  數(shù)據(jù)庫/ Python中function的__get__方法的疑問

Python中function的__get__方法的疑問

看descriptor的時候看到了,普通函數(shù)其實也是一個類的實例,function類,只是因為定義有特殊的__get__方法,所以才有各種function, bound method之類的表現(xiàn)。

那么既然def xxx的時候會產(chǎn)生一個function類的實例,那么在這個實例里def __get__()的時候不是又會產(chǎn)生一個function的實例?這不是發(fā)生遞歸定義了嗎?

回答
編輯回答
涼心人

在函數(shù)體(def top():)中再定義函數(shù) def xxx 會不會產(chǎn)生一個 function 實例?答案是會。從翻譯成opcode的結(jié)果來看,函數(shù)體中會執(zhí)行 MAKE_FUNCITON 指令,這個指定是會申請一個內(nèi)存空間,并設(shè)置其運行的堆棧信息和變量空間等,也就是相當(dāng)于 new 了一個實例。每次調(diào)用 top() 函數(shù),因為該函數(shù)里定義了 def xxx ,所以依然會執(zhí)行 MAKE_FUNCITON 指令,也就是說,每次調(diào)用了 top ,里面的 xxx = new Funciton(),都會是不同的函數(shù)對象。

題主中提到的 __get__() 是特殊的內(nèi)置方法,如果你 print(type(top.__get__)) 就能看到它并不是函數(shù)的實例,而是 <class 'method-wrapper'> 。想在函數(shù)內(nèi)定義 __get__() 方法來覆蓋應(yīng)該是行不通的,也就不存在發(fā)生遞歸定義的問題了。

這問題感覺問得挺好的,怎么都沒什么人來討論一下呢。

2018年4月23日 05:27
編輯回答
念初

我猜你可能是想問:在a.b的時候會調(diào)用b.__get__(),那么同理,b.__get__會不會也一樣調(diào)用__get__.__get__呢?

2017年9月28日 19:39