私はそのようなものを使いたい:
class Board():
...
def __getitem__(self, y, x):
return self.board[y][x]
残念ながら、私が電話すると:
board[x][y]
私は得る:
TypeError: __getitem__() takes exactly 3 arguments (2 given)
私はそのようなものを使いたい:
class Board():
...
def __getitem__(self, y, x):
return self.board[y][x]
残念ながら、私が電話すると:
board[x][y]
私は得る:
TypeError: __getitem__() takes exactly 3 arguments (2 given)
これを行うと、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]
意図的なものですか?)
次の構文を使用することを検討してください。
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が必要です。
ただ行う:
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
b がクラス オブジェクト b = Board() であるとします。探しているときはB[0][0]
__getitem__
、通常は動作しません。代わりに、b のデータを新しい変数に等しく設定することができます。
boardData = b.data
print(boardData[0][0])