Python魔术方法之__getitem__
__getitem__
是 Python 中的一个特殊方法(也称为魔术方法或双下方法),用于实现对象的索引操作。通过定义 __getitem__
方法,可以使对象支持类似列表或字典的索引访问方式。
1. __getitem__
的作用
__getitem__
方法允许对象使用 []
语法进行索引操作。例如:
obj[key]
这行代码会被 Python 解释为:
obj.__getitem__(key)
2. 实现 __getitem__
通过实现 __getitem__
方法,可以让自定义类支持索引操作。
示例 1:实现类似列表的索引
class MyList: def __init__(self, data): self.data = data def __getitem__(self, index): return self.data[index] # 使用 my_list = MyList([1, 2, 3, 4, 5]) print(my_list[2]) # 输出: 3 print(my_list[1:4]) # 输出: [2, 3, 4](支持切片)
示例 2:实现类似字典的键值访问
class MyDict: def __init__(self): self.data = {} def __getitem__(self, key): return self.data.get(key, "Key not found") def __setitem__(self, key, value): self.data[key] = value # 使用 my_dict = MyDict() my_dict['name'] = 'Alice' print(my_dict['name']) # 输出: Alice print(my_dict['age']) # 输出: Key not found
3. __getitem__
的参数
__getitem__
方法的参数可以是:
- 整数索引:用于类似列表的索引访问。
- 切片对象:用于支持切片操作(如
my_list[1:4]
)。 - 键值:用于类似字典的键值访问。
示例:支持切片
class MyList: def __init__(self, data): self.data = data def __getitem__(self, index): if isinstance(index, slice): # 检查是否是切片 return self.data[index.start:index.stop:index.step] return self.data[index] # 使用 my_list = MyList([1, 2, 3, 4, 5]) print(my_list[1:4]) # 输出: [2, 3, 4]
4. __getitem__
和迭代
如果一个类实现了 __getitem__
,它还可以支持迭代操作(如 for
循环)。Python 会从索引 0
开始调用 __getitem__
,直到抛出 IndexError
。
示例:支持迭代
class MyList: def __init__(self, data): self.data = data def __getitem__(self, index): return self.data[index] # 使用 my_list = MyList([10, 20, 30, 40]) for item in my_list: print(item) # 输出: # 10 # 20 # 30 # 40
5. __getitem__
和 __len__
如果希望对象支持 len()
函数,还需要实现 __len__
方法。
示例:支持 len()
class MyList: def __init__(self, data): self.data = data def __getitem__(self, index): return self.data[index] def __len__(self): return len(self.data) # 使用 my_list = MyList([1, 2, 3, 4, 5]) print(len(my_list)) # 输出: 5
6. 使用场景
__getitem__
的常见使用场景包括:
- 自定义集合类(如列表、字典)。
- 实现类似数组的数据结构。
- 支持切片操作。
- 使对象可迭代。
7. 注意事项
- 如果索引超出范围,应抛出
IndexError
。 - 如果键不存在,应抛出
KeyError
。 - 如果对象不支持某些操作(如切片),可以在
__getitem__
中抛出TypeError
。
示例:处理异常
class MyList: def __init__(self, data): self.data = data def __getitem__(self, index): if index >= len(self.data): raise IndexError("Index out of range") return self.data[index] # 使用 my_list = MyList([1, 2, 3]) print(my_list[5]) # 抛出 IndexError: Index out of range
总结
__getitem__
是 Python 中用于实现索引操作的特殊方法。- 通过实现
__getitem__
,可以使对象支持[]
语法、切片和迭代。 - 结合
__len__
方法,可以使对象更完整地模拟内置集合类型。 - 在实现时,注意处理索引越界和键不存在的异常情况。
通过合理使用 __getitem__
,可以让自定义类的行为更加直观和 Pythonic。
进阶高级测试工程师 文章被收录于专栏
《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart