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

为何__get__()被规定为带有可选第三个参数?

描述符协议中__get__方法参数设计的原因

问题背景

《Descriptor HowTo Guide(描述符协议)》规定__get__()必须可接受2个或3个参数,签名为:

descr.__get__(self, obj, type=None) -> value

实际疑问:CPython总会传入3个参数,type=None这个默认参数似乎从未被使用过,为何协议要如此定义?(注:已看过相关Stack Overflow问题,但该问题聚焦于开发者为何使用该签名,而非协议本身为何如此规定)

核心原因

  • 适配历史版本的调用逻辑
    在Python 2.x的部分场景中,当直接通过类访问描述符时,解释器可能仅传入2个参数(self和obj,此时obj为None)。设置type=None的默认参数,是为了让描述符实现能兼容这种旧的调用方式,确保在新旧Python版本中都能正常运行。

  • 保障跨实现的通用性
    描述符协议是Python语言层面的规范,并非只针对CPython。像PyPy、Jython等其他Python实现,或者自定义的属性访问逻辑,可能会存在仅传入2个参数的场景。默认参数的存在,让描述符的实现无需强制处理参数数量不一致的问题,提升了协议的兼容性与灵活性。

  • 语义清晰的设计考量
    type参数代表描述符所属的类:通过实例访问时,它是实例的类;通过类访问时,它就是类本身。None作为默认值,是语义上的兜底,明确了未传入类信息时的默认状态,既符合Python函数默认参数的设计习惯,也让方法签名的语义更直观。

内容的提问来源于stack exchange,提问作者Feuermurmel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 00:59:50