9

Grid使用してアクセスしたいクラスがありますmyGrid[1][2]。このメソッドで最初の角かっこをオーバーロードできることはわかっていますが__getitem__()、2番目の角かっこはどうでしょうか。

これは、次のことも実装するヘルパークラスを用意することで達成できると思いました__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 に答える