You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:32:58