Personalizar Python Slicing, por favor avise

Tengo una clase que subclasifica el objeto de lista. Ahora necesito manejar rebanar. De todo lo que leo en los intertubos, esto debe hacerse usando el método __getitem__ . Al menos en Python 2.7+ que es lo que estoy usando. He hecho esto (ver más abajo), pero el método __getitem__ no se llama cuando paso en una porción. En su lugar, se hace un sector y se devuelve una lista. Me gustaría una nueva instancia de mi lista devuelta.

Por favor, ayúdame a descubrir lo que está mal.

¡Gracias!

 class myList(list): def __init__(self, items): super(myList, self).__init__(items) self.name = 'myList' def __getitem__(self, index): print("__getitem__") if isinstance(index, slice): print("slice") return self.__class__( self[x] for x in range(*index.indices(len(self))) ) else: return super(myList, self).__getitem__(index) if __name__ == "__main__": print("\nI'm tesing out custom slicing.\n") N = 10 L = myList(range(N)) L3 = L[3] L02 = L[:2] 

Vea esta nota :

object.__getslice__(self, i, j)

En desuso desde la versión 2.0: admite objetos de sector como parámetros para el método __getitem__() . (Sin embargo, los tipos incorporados en CPython actualmente todavía implementan __getslice__() . Por lo tanto, debe anularlo en las clases derivadas cuando se implementa la __getslice__() .

Entonces, debido a que la list subclases tiene que sobrescribir __getslice__ , aunque esté en desuso.

Creo que generalmente deberías evitar crear subclases incorporadas, hay demasiados detalles extraños. Si solo quieres una clase que se comporte como una lista, hay un ABC para ayudarte con eso:

 from collections import Sequence class MyList(Sequence): def __init__(self, *items): self.data = list(items) def __len__(self): return len(self.data) def __getitem__(self, slice): return self.data[slice] s = MyList(1,2,3) # lots of free methods print s[1:2], len(s), bool(s), s.count(3), s.index(2), iter(s)