2010-08-11 13 views
5

Sono novizio con python. Voglio scrivere una classe con due chiavi come indicizzatore. anche bisogno di essere in grado di utilizzarli all'interno di classe come questa:Indicizzatore con due chiavi in ​​pitone

a = Cartesian(-10,-10,10,10) # Cartesian is the name of my class 
a[-5][-1]=10 

e nella classe cartesiana:

def fill(self,value): 
    self[x][y] = x*y-value 

cerco con

def __getitem__(self,x,y): 
    return self.data[x-self.dx][y-self.dy] 

ma non funziona.

risposta

8

Se avete solo bisogno di un'applicazione leggera, si può avere __getitem__ accettare una tupla:

def __getitem__(self, c): 
    x, y = c 
    return self.data[x-self.dx][y-self.dy] 

def __setitem__(self, c, v): 
    x, y = c 
    self.data[x-self.dx][y-self.dy] = v 

e utilizzare in questo modo:

a[-5,-1] = 10 

Tuttavia, se si sta facendo un sacco di calcolo numerico o questo è parte integrante della tua applicazione, considera l'uso di Numpy e rappresenti semplicemente questa coordinata come un vettore: http://numpy.scipy.org/

+0

Grazie Carl, pitone è incredibile! Non so cosa sia insensibile, ci proverò. (diverso da Python?) –

+0

Numpy è una libreria python per il calcolo numerico. – gnud

+0

Numpy è una libreria per Python che rende il calcolo numerico un po 'più semplice (e più veloce del Python nativo). È simile a Matlab, ma per Python. È possibile eseguire operazioni con matrici e vettori abbastanza facilmente. – carl

1

C'è qualche motivo per te hai davvero bisogno di definire esplicitamente una classe Cartesian()? Ad esempio, ci sono metodi di calcolo su di esso? In caso contrario, utilizzare solo un elenco all'interno degli elenchi per utilizzare questo tipo di sintassi.

Se fai bisogno di una classe, quindi prendere in considerazione l'aggiunta di un metodo .coordinate(x, y) ad esso, invece, e non si preoccupano cercando di fare la sintassi lista.

+0

Sto solo provando Python, non devo realizzare nulla! ma sembra che gli indicizzatori siano più belli. –

1

accettare una tupla:

>>> class Foo(object): 
...  def __getitem__(self, key): 
...   x, y = key 
...   print x, y 
... f = Foo() 
... f[1,2] 
1 2 
+0

Grazie, (stessa risposta con sotto :) ...) –

Problemi correlati