Estoy tratando de implementar la funcionalidad de corte para una clase que estoy creando y que crea una representación vectorial.
Tengo este código hasta ahora, que creo que implementará correctamente el segmento, pero cada vez que hago una llamada como v[4]
donde v es un vector, python devuelve un error sobre no tener suficientes parámetros. Así que estoy tratando de averiguar cómo definir el getitem
método especial en mi clase para manejar tanto índices simples como cortes.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
python
slice
python-datamodel
nicotina
fuente
fuente
__getslice__
para las versiones de python 2.X. ver docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. Sin embargo, es bastante sutil.Tengo una lista "sintética" (una en la que los datos son más grandes de lo que le gustaría crear en la memoria) y mi
__getitem__
aspecto es el siguiente:El segmento no devuelve el mismo tipo, lo cual es un no-no, pero funciona para mí.
fuente
Los objetos Slice se crean automáticamente cuando usa dos puntos en la notación de subíndice, y eso es a lo que se le pasa
__getitem__
. Úseloisinstance
para verificar si tiene un objeto de corte:Digamos que estamos usando un objeto de rango, pero queremos que los cortes devuelvan listas en lugar de nuevos objetos de rango (como lo hace):
No podemos subclasificar el rango debido a limitaciones internas, pero podemos delegar en él:
No tenemos un objeto Range perfectamente reemplazable, pero está bastante cerca:
Para comprender mejor la notación de corte, aquí hay un ejemplo de uso de Sliceable:
Python 2, tenga en cuenta:
En Python 2, hay un método obsoleto que es posible que deba anular al subclasificar algunos tipos integrados.
De la documentación del modelo de datos :
Esto desapareció en Python 3.
fuente
Para extender la respuesta de Aaron, para cosas como
numpy
, puede hacer cortes multidimensionales al verificar sigiven
es untuple
:''
Salida:
fuente
La forma correcta de hacer esto es
__getitem__
tomar un parámetro, que puede ser un número o un objeto de corte.Ver:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
fuente