2013-07-04 7 views

risposta

8

Quando si esegue board[x][y] che riuscirai a causare due chiama allo __getitem__ perché si stanno effettuando due accessi separati: [x] è uno e [y] è un altro. Non c'è modo di gestirlo direttamente in __getitem__; dovresti avere board[x] restituire una specie di sottooggetto che potresti usare [y] per ottenere il singolo oggetto. Che probabilmente si desidera è di avere __getitem__ accettare una tupla:

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

Poi fare:

board[x, y] 

(Si noti che è l'ordine di xey commutato tra __getitem__ e board[x][y] --- è che intenzionale?)

2

board[x][y] significa board.__getitem__(x).__getitem__(y), così Board.__getitem__ deve restituire un qualche tipo di vista che supporta anche __getitem__ e ricorda x. Questo è un po 'di lavoro, ma per alcuni casi d'uso (tutto ciò che riguarda il passaggio di quella vista in giro) è molto conveniente.

Un'altra opzione è board[x, y], che significa board.__getitem__((x, y)). Nota che questo passa una tupla a __getitem__, che dovrai decomprimere manualmente (c'è lo zucchero sintattico per fare ciò in 2.x, ma è un po 'oscuro e anche andato in 3.x, quindi potresti volerlo evitare nell'interesse di futuri lavori di porting).

3

Basta fare:

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

perché quando si chiama b[x][y] si chiama in realtà __getitem__() due volte, come mostrato di seguito:

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

Ma la cosa migliore sarebbe di sottoclasse np.ndarray, in modo che don' Devo ri-implementare questo metodo:

class Board(np.ndarray): 
    pass 
1

Si potrebbe voler considerare l'utilizzo di questa sintassi:

board[(x, y)] 

E 'meno bella, ma permette di avere array multidimensionali semplicemente. Qualsiasi numero di dimensioni infatti:

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

Facendo bordo di una defaultdict si può anche avere dizionari sparse:

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 

Se volete qualcosa di più avanzato di quello che, probabilmente, si desidera NumPy.

Problemi correlati