关于wrapper-descriptor自身的描述符协议及函数类__get__调用逻辑的疑问
关于wrapper-descriptor自身的描述符协议及函数类__get__调用逻辑的疑问
我最近一直在琢磨一个问题:如果我访问wrapper-descriptor类自身的对象时,描述符协议会怎么运作?
为了搞清楚这个问题,我去研究了Python源码里的typeobject.c文件,发现里面有两个和__get__相关的函数——slot_tp_descr_get和wrap_descr_get。它们通过下面这段C代码关联起来:
TPSLOT(__get__, tp_descr_get, slot_tp_descr_get, wrap_descr_get, "__get__($self, instance, owner=None, /)\n--\n\nReturn an attribute of instance, which is of type owner.")
其中wrap_descr_get是一个包装函数,用来封装slot_tp_descr_get。
我仔细看了slot_tp_descr_get的代码,发现它会调用传入的self参数的__get__方法。这就让我产生了一个疑问:如果传入的是这个类自身的对象,会不会触发无限递归?函数里有一个带if判断的return语句,但我觉得这个分支不会被执行——因为这个if判断是检查self的类是否实现了__get__,而我们传入的是这个类的对象,显然是有__get__方法的,所以这个return不会生效。
相关问题
另外还有一个问题:当我像下面这样调用其他类(比如函数类)的__get__时:
def fun(): pass type(fun).__get__ # 或者 fun.__get__
底层的函数类__get__是被wrap_descr_get直接调用,还是会按照描述符协议,先找到__get__所属的类(也就是wrapper-descriptor),再调用这个类的__get__(也就是slot_tp_descr_get)呢?
备注:内容来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

