проблема, с которой вы столкнулись, заключается в том, что, как указано в исключении, объект slice
не является итерируемым. Я считаю, что лучший способ подумать о том, что это фрагмент, заключается в том, что это инструкция, которая присваивается итерации, чтобы определить, что она возвращает. Так что, если вы пытаетесь получить что-то вроде этого:
>>> L = [1, 2, 3, 4]
>>> L[1:3]
[2, 3]
(очевидно, это упрощенный пример использования списков вместо пользовательского класса)
Кусочек, который передан __getitem__
будет иметь несколько атрибутов вы можете использовать:
>>> s = slice(1, 2, 3)
>>> s.start, s.stop, s.step
(1, 2, 3)
Если вы говорите s = slice(1, 2)
то step
атрибут Wi будет None
. Вы можете использовать эту информацию, чтобы получить кусочек списка, кортеж или все, что вы хотите в __getitem__
:
def __getitem__(self, i):
if isinstance(i, int):
return foo(i)
elif isinstance(i, slice):
return [foo(k) for k in self.bar[i]] # where bar is a list/tuple
Причина это работает, потому что вызов self.bar[i]
где i
является срезом на самом деле не отличается от вызова self.bar[1:2]
, потому что 1:2
- это просто объект slice
как есть i
.
Надеюсь, это было полезно!
Я не уверен, что какой-либо другой код будет полезен. В основном, я хочу, чтобы взять срез от n до m и перебрать значения от n до m, так же, как я могу перебрать диапазон (n, m). –