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

如何实现支持[][]式索引的二维数组__getitem__方法

实现二维数组的[][]式访问思路

要实现array[1][0]这种链式索引访问,核心是利用两次调用__getitem__方法的特性:

  1. 第一次调用array[1]时,__getitem__接收单个索引参数1,此时不直接返回元素值,而是返回一个辅助访问对象
  2. 第二次调用[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:35:09