如何实现支持[][]式索引的二维数组__getitem__方法
实现二维数组的
[][]式访问思路 要实现array[1][0]这种链式索引访问,核心是利用两次调用__getitem__方法的特性:
- 第一次调用
array[1]时,__getitem__接收单个索引参数1,此时不直接返回元素值,而是返回一个辅助访问对象 - 第二次调用
[0]时,会触发这个辅助对象的__getitem__方法,接收参数0,再从对应的行中取出目标元素
具体实现示例
class My2DArray: def __init__(self, data): self.twoDim = data def __getitem__(self, x): # 定义内部辅助类,用于处理列索引 class RowAccessor: def __init__(self, row_data): self.row = row_data def __getitem__(self, y): return self.row[y] # 返回辅助对象,供后续的[]调用使用 return RowAccessor(self.twoDim[x])
兼容原有元组式访问的优化
如果想同时保留array[1,0]的使用方式,可以在__getitem__中判断参数类型:
class My2DArray: def __init__(self, data): self.twoDim = data def __getitem__(self, item): # 兼容元组形式的索引 if isinstance(item, tuple): x, y = item return self.twoDim[x][y] # 处理链式索引的情况 class RowAccessor: def __init__(self, row_data): self.row = row_data def __getitem__(self, y): return self.row[y] return RowAccessor(self.twoDim[item])
原理说明
array[1][0]本质上是(array.__getitem__(1)).__getitem__(0)的语法糖,所以第一次调用返回的对象必须具备__getitem__方法,才能响应第二次索引操作。
内容的提问来源于stack exchange,提问作者ili
相关产品推荐
相关产品推荐

