为了账号安全,请及时绑定邮箱和手机立即绑定

Python中function的__get__方法的疑问

Python中function的__get__方法的疑问

富国沪深 2019-02-20 05:37:36
看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__() 方法来覆盖应该是行不通的,也就不存在发生递归定义的问题了。

这问题感觉问得挺好的,怎么都没什么人来讨论一下呢。

查看完整回答
反对 回复 2019-03-01
?
达令说

TA贡献1821条经验 获得超6个赞

我猜你可能是想问:在a.b的时候会调用b.__get__(),那么同理,b.__get__会不会也一样调用__get__.__get__呢?

查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 567 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信