Я пытаюсь реализовать функциональность среза для создаваемого мной класса, который создает векторное представление.
У меня пока есть этот код, который, как я полагаю, правильно реализует срез, но всякий раз, когда я делаю вызов, например, v[4]
где v - вектор, python возвращает ошибку о нехватке параметров. Итак, я пытаюсь понять, как определить getitem
в моем классе специальный метод для обработки как простых индексов, так и нарезки.
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
никотин
источник
источник
__getslice__
для версий python 2.X. см. docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. Хотя это довольно тонко.У меня есть "синтетический" список (тот, в котором данных больше, чем вы хотели бы создать в памяти), и мой
__getitem__
выглядит так:Срез не возвращает тот же тип, что нельзя, но у меня это работает.
источник
Объекты Slice создаются автоматически, когда вы используете двоеточие в обозначении нижнего индекса - и это то, что передается
__getitem__
. Используйте,isinstance
чтобы проверить, есть ли у вас объект среза:Скажем, мы использовали объект диапазона, но мы хотим, чтобы срезы возвращали списки вместо новых объектов диапазона (как это происходит):
Мы не можем создавать подклассы из-за внутренних ограничений, но можем делегировать ему:
У нас нет идеально заменяемого объекта Range, но он довольно близок:
Чтобы лучше понять нотацию срезов, вот пример использования Sliceable:
Python 2, имейте в виду:
В Python 2 есть устаревший метод, который может потребоваться переопределить при создании подкласса некоторых встроенных типов.
Из документации по модели данных :
Этого нет в Python 3.
источник
Чтобы расширить ответ Аарона, например
numpy
, вы можете сделать многомерный срез, проверив,given
является ли онtuple
:`` `
Вывод:
источник
Правильный способ сделать это -
__getitem__
взять один параметр, который может быть числом или объектом среза.Видеть:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
источник