看descriptor的时候看到了,普通函数其实也是一个类的实例,function类,只是因为定义有特殊的__get__方法,所以才有各种function, bound method之类的表现。
那么既然def xxx的时候会产生一个function类的实例,那么在这个实例里def __get__()的时候不是又会产生一个function的实例?这不是发生递归定义了吗?
2 回答
撒科打诨
TA贡献1934条经验 获得超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__()
方法来覆盖应该是行不通的,也就不存在发生递归定义的问题了。
这问题感觉问得挺好的,怎么都没什么人来讨论一下呢。
添加回答
举报
0/150
提交
取消