2010-08-11 8 views
5

Je suis novice avec python. Je veux écrire une classe avec deux clés comme indexeur. doivent également être en mesure de les utiliser à l'intérieur de la classe comme ceci:Indexeur avec deux clés en python

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

et dans la classe cartésien:

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

J'essaie avec

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

mais ne fonctionne pas.

Répondre

8

Si vous avez juste besoin d'une application légère, vous pouvez avoir __getitem__ accepter un tuple:

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 

et utiliser comme ceci:

a[-5,-1] = 10 

Cependant, si vous faites beaucoup de calcul numérique ou cela fait partie intégrante de votre application, pensez à utiliser Numpy et représentez simplement cette coordonnée comme un vecteur: http://numpy.scipy.org/

+0

Merci Carl, python est incroyable! Je ne sais pas ce qui est numpy, je vais l'essayer. (différent avec python?) –

+0

Numpy est une bibliothèque python pour l'informatique numérique. – gnud

+0

Numpy est une bibliothèque pour Python qui rend le calcul numérique un peu plus facile (et plus rapide que Python natif). C'est similaire à Matlab, mais pour Python. Vous pouvez effectuer des opérations matricielles et vectorielles assez facilement. – carl

1

Y a-t-il une raison pour laquelle? Vous avez réellement besoin de définir explicitement une classe Cartesian()? Par exemple, y a-t-il des méthodes de calcul? Sinon, utilisez simplement des listes dans les listes pour utiliser ce type de syntaxe.

Si vous faites besoin d'une classe, puis envisager d'ajouter une méthode à .coordinate(x, y) au lieu et ne prenez pas la peine d'essayer de faire la syntaxe de liste.

+0

Je suis en train d'essayer Python, je n'ai rien à accomplir! mais il semble que les indexeurs sont plus beaux. –

1

Encaisser un tuple:

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

Merci, (même réponse ci-dessous :) ...) –

Questions connexes