猿问

Python中function的__get__方法的疑问

看descriptor的时候看到了,普通函数其实也是一个类的实例,function类,只是因为定义有特殊的__get__方法,所以才有各种function, bound method之类的表现。

那么既然def xxx的时候会产生一个function类的实例,那么在这个实例里def __get__()的时候不是又会产生一个function的实例?这不是发生递归定义了吗?

富国沪深
浏览 568回答 2
2回答

撒科打诨

在函数体(def top():)中再定义函数 def xxx 会不会产生一个 function 实例?答案是会。从翻译成opcode的结果来看,函数体中会执行 MAKE_FUNCITON 指令,这个指定是会申请一个内存空间,并设置其运行的堆栈信息和变量空间等,也就是相当于 new 了一个实例。每次调用 top() 函数,因为该函数里定义了 def xxx ,所以依然会执行 MAKE_FUNCITON 指令,也就是说,每次调用了 top ,里面的 xxx = new Funciton(),都会是不同的函数对象。 题主中提到的 __get__() 是特殊的内置方法,如果你 print(type(top.__get__)) 就能看到它并不是函数的实例,而是 <class 'method-wrapper'> 。想在函数内定义 __get__() 方法来覆盖应该是行不通的,也就不存在发生递归定义的问题了。 这问题感觉问得挺好的,怎么都没什么人来讨论一下呢。

达令说

我猜你可能是想问:在a.b的时候会调用b.__get__(),那么同理,b.__get__会不会也一样调用__get__.__get__呢?
随时随地看视频慕课网APP

相关分类

Python
我要回答