看descriptor的时候看到了,普通函数其实也是一个类的实例,function类,只是因为定义有特殊的__get__
方法,所以才有各种function, bound method
之类的表现。
那么既然def xxx
的时候会产生一个function
类的实例,那么在这个实例里def __get__()
的时候不是又会产生一个function
的实例?这不是发生递归定义了吗?
看descriptor的时候看到了,普通函数其实也是一个类的实例,function类,只是因为定义有特殊的__get__
方法,所以才有各种function, bound method
之类的表现。
那么既然def xxx
的时候会产生一个function
类的实例,那么在这个实例里def __get__()
的时候不是又会产生一个function
的实例?这不是发生递归定义了吗?
4 回答4.5k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.9k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
在函数体(
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__()
方法来覆盖应该是行不通的,也就不存在发生递归定义的问题了。这问题感觉问得挺好的,怎么都没什么人来讨论一下呢。