Python overloading multiple getitems / index requests

拥有回忆 提交于 2019-12-20 12:45:14

问题


I have a Grid class which I want to access using myGrid[1][2]. I know I can overload the first set of square brackets with the __getitem__() method, but what about the second.

I thought I could achieve this by having a helper class which also implements __getitem__ and then:

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]

This seems a little too homebrewed... What is the python way to achieve this?


回答1:


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]

prints

[1, 2]
[3, 4]
2



回答2:


As far as I know the way anajem mentions is the only way.

example:

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

Prints: 4

Does not operate exactly as you want it to but does the trick in my eyes.




回答3:


you could make the index into a tuple: def getitem(self,indexTuple): x, y = indexTuple ...

and access the object override: instance[[2,3]]
or instance[(2,3)]




回答4:


This question is quite old, but I'll add my answer anyway for newcomers.
I ran into this need myself, and here's a solution that worked for me:

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

Notice that this will not work for single access!
So, for example, if you want to use something of the form g[0] to get [0,1,2] it will not work, and instead you'll get nonsensical result (the object itself).



来源:https://stackoverflow.com/questions/11000623/python-overloading-multiple-getitems-index-requests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!