__getitem__
Khand 15
khand15 en gmail.com
Lun Abr 23 14:30:51 CEST 2007
El día 23/04/07, Jaume Martin Claramonte <jaumartin en gmail.com> escribió:
>
> El dom, 22-04-2007 a las 21:59 +0200, Alexis Roda escribió:
> > En/na Jaume Martin Claramonte ha escrit:
> > > Hola, estoy contruyendo una clase que tiene dos campos, un vector y un
> > > entero, necesito contruir el __getitem__ para acceder a elementos de
> la
> > > lista pero nose como hacerlo ya que si uso el [] soble la misma lista
> > > entra en recursion infinita, como lo soluciono?
> >
> > No estoy seguro de entender el problema:
> >
> > class A :
> > def __init__(self, v, ...) :
> > ...
> > self.vector = v
> > ...
> >
> > def __getitem__(self, i) :
> > return self.vector[i]
>
> si basicamente seria eso, pongo el codigo para que quede mas caro.
>
> class Pieza:
> def __init__(self, c_max=50, t_max=10, h_max=100, l_max=100):
> self.vec_piezas = self.creapiezas(c_max, t_max, h_max, l_max)
> self.n = c_max
>
> def creapiezas(self, c_max=50, t_max=10, h_max=100, l_max=100):
> vec = []
> ...
> ...
> return vec
>
> def __getitem__(self, i):
> if i > len(self):
> raise IndexError, "list index out of range"
> elif i < 0 and abs(i) < len(self):
> index = len(self) - i
> return """Devolver el valor del indice correspondiente """
> else:
> return """Devolver el valor del indice correspondiente """
Hola Jaume.
Creo que lo que buscas es algo así.
class Pieza:
def __init__(self, c_max=50, t_max=10, h_max=100, l_max=100):
# Asi evitas recursion
self.__dict__['vec_piezas'] = self.creapiezas(c_max, t_max, h_max,
l_max)
self.__dict__['n'] = c_max
def creapiezas(self, c_max=50, t_max=10, h_max=100, l_max=100):
vec = range(0, 10) # Aquí haces lo que sea
return vec
def __getitem__(self, i):
if self.__dict__.has_key(i):
# Con esto llamas al atributo si existe y si no, lo intenta con
el slice
return self.__dict__[i]
try:
n = int(i)
except:
raise AttributeError, "Attribute don't exists"
try:
return self.__dict__['vec_piezas'][n]
except:
raise IndexError, "List index out of range"
def __getslice__(self, a, b):
return self.__dict__['vec_piezas'][a:b]
if __name__ == '__main__':
p = Pieza()
print p[5]
#print p[12] # para que falle
#print p['hola'] # para que falle
print p[2:5]
Para hacer el __setitem__ sería un proceso parecido. En todo caso, yo creo
que deberias hacer heredar tu clase Pieza de list, con lo que prácticamente
no habría nada que hacer...
Espero haberte servido de ayuda.
Más información sobre la lista de distribución Python-es