Estou tentando implementar a funcionalidade de fatia para uma classe que estou criando que cria uma representação vetorial.
Eu tenho esse código até agora, que acredito que implementará corretamente a fatia, mas sempre que faço uma chamada como v[4]
onde v é um vetor, o python retorna um erro sobre não ter parâmetros suficientes. Portanto, estou tentando descobrir como definir o getitem
método especial em minha classe para lidar com índices simples e fatiamento.
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
fonte
fonte
__getslice__
para versões 2.X do python. consulte docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. É muito sutil, no entanto.Eu tenho uma lista "sintética" (uma em que os dados são maiores do que você gostaria de criar na memória) e minha
__getitem__
aparência é assim:A fatia não retorna o mesmo tipo, o que é um não, mas funciona para mim.
fonte
Objetos de fatia são criados automaticamente quando você usa dois-pontos na notação de subscrito - e é para isso que é passado
__getitem__
. Useisinstance
para verificar se você tem um objeto de fatia:Digamos que estivéssemos usando um objeto de intervalo, mas queremos que as fatias retornem listas em vez de novos objetos de intervalo (como acontece):
Não podemos subclassificar o intervalo devido a limitações internas, mas podemos delegar a ele:
Não temos um objeto Range perfeitamente substituível, mas é bastante próximo:
Para entender melhor a notação de fatia, aqui está um exemplo de uso de Sliceable:
Python 2, esteja ciente:
No Python 2, há um método obsoleto que você pode precisar substituir ao criar subclasses de alguns tipos integrados.
Da documentação do modelo de dados :
Isso acabou no Python 3.
fonte
Para estender a resposta de Aaron, para coisas como
numpy
, você pode fazer o corte multi-dimensional, verificando para ver segiven
é umtuple
:`` `
Resultado:
fonte
A maneira correta de fazer isso é
__getitem__
pegar um parâmetro, que pode ser um número ou um objeto de fatia.Vejo:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
fonte