19

私はそのようなものを使いたい:

class Board():
    ...
    def __getitem__(self, y, x):
        return self.board[y][x]

残念ながら、私が電話すると:

board[x][y]

私は得る: TypeError: __getitem__() takes exactly 3 arguments (2 given)

4

5 に答える 5

23

これを行うと、is one とis another の2 つの別々のアクセスを行っているため、2 つの呼び出しboard[x][y]が発生します。でこれを直接処理する方法はありません。個々のアイテムを取得するために使用できる何らかのサブオブジェクトを返す必要があります。おそらくあなたが望むのは、タプルを受け入れることです:__getitem__[x][y]__getitem__board[x][y]__getitem__

def __getitem__(self, tup):
    y, x = tup
    return self.board[y][x]

次に、次のようにします。

board[x, y]

(x と y の順序が入れ替わっていることに注意してください__getitem__---board[x][y]意図的なものですか?)

于 2013-07-04T21:30:01.523 に答える
5

次の構文を使用することを検討してください。

board[(x, y)]

あまりきれいではありませんが、多次元配列を簡単に作成できます。実際には任意の数の次元:

board[(1,6,34,2,6)]

board を defaultdict にすることで、まばらな辞書を持つことさえできます:

board[(1,6,34,2,6)]

>>> from collections import defaultdict
>>> board = defaultdict(lambda: 0)
>>> board[(1,6,8)] = 7
>>> board[(1,6,8)]
7
>>> board[(5,6,3)]
0

それよりも高度なものが必要な場合は、おそらくNumPyが必要です。

于 2013-07-04T21:58:11.347 に答える
3

ただ行う:

class Board():
    def __getitem__(self, x):
        return self.board[x]

以下に示すように、呼び出すb[x][y]と実際には2回呼び出されるためです。__getitem__()

import numpy as np
b = Board()
b.board = np.random.random((3,3,3))
print (b[2][0]==(b[2])[0]).all()
#True

np.ndarrayただし、このメソッドを再実装する必要がないように、をサブクラス化するのが最善です。

class Board(np.ndarray):
    pass
于 2013-07-04T21:49:13.330 に答える
-1

b がクラス オブジェクト b = Board() であるとします。探しているときはB[0][0] __getitem__、通常は動作しません。代わりに、b のデータを新しい変数に等しく設定することができます。

boardData = b.data

print(boardData[0][0]) 
于 2020-05-04T20:26:19.943 に答える