2013-07-04 16 views

Odpowiedz

8

Kiedy robisz board[x][y] będzie powodować dwa połączenia z numerem __getitem__, ponieważ robisz dwa osobne wejścia: [x] to jeden i [y] to kolejny. Nie ma sposobu, aby obsłużyć to bezpośrednio w __getitem__; musiałbyś mieć board[x] zwrócić jakiś pod-obiekt, który mógłbyś użyć na [y], aby uzyskać indywidualny przedmiot. Co prawdopodobnie chcesz to mieć __getitem__ akceptuje krotki:

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

Następnie wykonaj:

board[x, y] 

(Zauważ, że masz porządek z X i Y przełączany pomiędzy __getitem__ i board[x][y] --- jest to, że zamierzone?)

2

board[x][y] oznacza board.__getitem__(x).__getitem__(y), więc Board.__getitem__ musi wrócić jakiś pogląd, że również obsługuje __getitem__ i pamięta x. To trochę pracy, ale w niektórych przypadkach (wszystko, co wiąże się z przekazywaniem tego widoku), jest to bardzo wygodne.

Inną opcją jest board[x, y], co oznacza board.__getitem__((x, y)). Zauważ, że to przekazuje krotkę do __getitem__, którą będziesz musiał rozpakować ręcznie (w tym przypadku jest to syntaktyczny cukier w 2.x, ale jest trochę niejasny, a także zniknął w 3.x, więc możesz tego uniknąć w interesie przyszłych prac związanych z przeniesieniem).

3

Wystarczy zrobić:

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

ponieważ podczas rozmowy b[x][y] faktycznie nazywa __getitem__() dwa razy, jak pokazano poniżej:

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

Ale najlepiej byłoby podklasy np.ndarray, tak że don” t należy ponownie zastosować tę metodę:

class Board(np.ndarray): 
    pass 
1

Możesz rozważyć użycie tej składni:

board[(x, y)] 

Jest mniej ładna, ale pozwala na proste tworzenie tablic wielowymiarowych. Dowolna ilość wymiarów w rzeczywistości:

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

Dokonując pokładzie defaultdict można nawet mieć rzadki słowniki:

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 

Jeśli chcesz coś bardziej zaawansowanego niż prawdopodobnie chcesz NumPy.

Powiązane problemy