9

我有一个Grid类,我想使用myGrid[1][2]. 我知道我可以用该方法重载第一组方括号__getitem__(),但是第二组呢。

我认为我可以通过拥有一个也实现的辅助类来实现这一点__getitem__,然后:

class Grid:

    def __init__(self)
        self.list = A TWO DIMENSIONAL LIST       

    ...

    def __getitem__(self, index):
        return GridIndexHelper(self, index)

class GridIndexHelper:

    def __init__(self, grid, index1):
        self.grid = grid
        self.index1 = index1

    ....

    def __getitem__(self, index):
        return self.grid.list[self.index1][index]

这似乎有点太自制了......实现这一目标的python方法是什么?

4

4 回答 4

12
class Grid:

    def __init__(self):
        self.list = [[1,2], [3,4]]

    def __getitem__(self, index):
        return self.list[index]

g = Grid();

print g[0]
print g[1]
print g[0][1]

印刷

[1, 2]
[3, 4]
2
于 2012-06-12T16:24:33.273 回答
6

据我所知,anajem 提到的方式是唯一的方法。

例子:

class Grid(object):

def __init__(self):
    self.list = [[1, 2], [3, 4]]

def __getitem__(self, index):
    return self.list[index[0]][index[1]]

if __name__ == '__main__':
    mygrid = Grid()
    mygrid[1, 1] #How a call would look

打印:4

不完全按照您的意愿操作,但在我眼中可以做到这一点。

于 2013-10-01T02:59:08.600 回答
1

你可以把索引变成一个元组: def getitem (self,indexTuple): x, y = indexTuple ...

并访问对象覆盖:instance[[2,3]]
或 instance[(2,3)]

于 2013-04-23T21:21:38.040 回答
0

这个问题很老了,但无论如何我都会为新手添加我的答案。
我自己也遇到了这种需求,这是一个对我有用的解决方案:

class Grid:

    def __init__(self):
        self.matrix = [[0,1,2],[3,4,5],[6,7,8]]
        self.second_access = False

    def __getitem__(self, key):
        if not self.second_access:
            self.first_key = key
            self.second_access = True
            return self
        else:
            self.second_access = False
            return self.matrix[self.first_key][key]


g = Grid()
print(g[1][2])  # 5
print(g[0][1])  # 1
print(g[2][0])  # 6

请注意,这不适用于单次访问!
因此,例如,如果您想使用某种形式的东西g[0]来获取[0,1,2]它,它将不起作用,相反,您会得到无意义的结果(对象本身)。

于 2017-04-17T16:06:35.267 回答