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

Python中function的__get__方法的疑問(wèn)

看descriptor的時(shí)候看到了,普通函數(shù)其實(shí)也是一個(gè)類(lèi)的實(shí)例,function類(lèi),只是因?yàn)槎x有特殊的__get__方法,所以才有各種function, bound method之類(lèi)的表現(xiàn)。

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

回答
編輯回答
涼心人

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

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

這問(wèn)題感覺(jué)問(wèn)得挺好的,怎么都沒(méi)什么人來(lái)討論一下呢。

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

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

2017年9月28日 19:39