__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