要支持[]索引取值,类必须实现__getitem__方法,它接收索引键并返回对应值;python解释器遇到obj[key]时自动调用该方法,根据参数类型(int、str、slice)区分序列/映射/切片行为,并建议按场景抛出indexerror、keyerror或typeerror。

Python 类要支持 [] 索引取值,必须实现 __getitem__ 方法,且该方法必须接收一个参数(索引键),返回对应值;否则会报 TypeError: 'YourClass' object is not subscriptable。
为什么只实现 __getitem__ 就能用方括号?
Python 解释器在遇到 obj[key] 时,会自动调用 obj.__getitem__(key)。它不强制要求类是序列或映射,只要该方法存在且逻辑合理,就能响应索引操作。
- 如果传入
int(如obj[0]),通常按位置取值,此时建议同时实现__len__以支持len(obj)和 for 循环 - 如果传入
str(如obj["name"]),行为更接近字典,可内部用dict存储数据 - 若同时支持整数和切片(
obj[1:5]),__getitem__的参数可能是slice对象,需显式判断类型并处理
__getitem__ 中如何处理越界和非法索引?
Python 不要求你抛出特定异常,但为符合直觉,应按场景选择:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 对整数索引(类似列表):越界时抛
IndexError,比如raise IndexError(f"index {key} out of range") - 对字符串键(类似字典):键不存在时抛
KeyError,比如raise KeyError(key) - 收到不支持的类型(如
obj[3.14]),建议抛TypeError,明确拒绝非预期输入 - 切片对象默认不检查边界,可直接返回子序列(如
self._data[key]若_data是 list)
常见错误:忘了返回值或返回了 None
__getitem__ 必须有明确的 return,否则隐式返回 None,导致取值结果意外为 None,且容易掩盖逻辑漏洞。
- 错误写法:
def __getitem__(self, key): print(self._data[key])→ 调用obj[0]返回None - 正确写法:
def __getitem__(self, key): return self._data[key] - 若内部使用字典,别漏掉
return:return self._store[key],不是self._store[key]单独一行 - 切片处理时,确保返回可迭代对象(如
list),否则for x in obj[1:3]会失败
真正难的不是写这个方法,而是想清楚你的类「到底想被怎么索引」——是当数组用?当配置字典用?还是混合模式?不同语义下,__getitem__ 的健壮性和错误提示差别很大。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










