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

为什么Python中x[i]不等价于直接调用实例的__getitem__方法?

Python []运算符调用类层面__getitem__的设计优势及异常场景解释

根据Python官方文档说明:

x[i]大致等价于type(x).__getitem__(x, i)。


该设计相比直接调用x.__getitem__(i)的核心优势

  • 性能优化空间大:对于list、dict等高频使用的内置类型,解释器可以直接在类层面缓存特殊方法的地址,不需要每次执行运算符都遍历实例的属性字典查找,大幅提升核心操作的执行效率。
  • 协议一致性更强:双下方法(特殊方法)本质是Python定义的类层面协议,要求同一个类的所有实例的运算符行为保持统一,避免开发者随意给单个实例绑定特殊方法,破坏依赖对应协议的标准库、第三方库的运行逻辑。
  • 兼容元类行为:当运算符作用在类本身(而非类的实例)上时,会自动调用对应元类的特殊方法,该规则和实例调用逻辑完全统一,不需要为类的运算符单独设计一套执行逻辑。

示例异常场景解释

你给出的示例中的异常正是该规则的直接体现:

  • poww_bar返回的实例所属的Bar类,在类层面定义了__getitem__,因此不管是直接调用实例的__getitem__还是用[]运算符,都能正常执行。
  • poww_foo返回的实例,只是在实例自身的属性字典里新增了__getitem__方法,所属的Foo类本身没有定义该方法,因此[]运算符去类层面查找时找不到对应实现,就抛出了'Foo' object is not subscriptable的错误,而直接调用实例的__getitem__是访问实例自身的属性,所以可以正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 00:45:03