Ответ 1
Вам необходимо предоставить пользовательский __getitem__()
, __setitem__
и __delitem__
.
Они передаются объект среза при разрезании списка; они имеют атрибуты start
, stop
и step
(что может быть None
):
def __getitem__(self, key):
if isinstance(key, slice):
return [self.list[i] for i in xrange(key.start, key.stop, key.step)]
return self.list[key]
или, для вашего случая:
def __getitem__(self, key):
return self.list[key]
потому что a list
может непосредственно взять объект slice
.
В Python 2 list.__getslice__
вызывается для срезов без шага (так что только начальные и конечные индексы), если они реализованы, и встроенный -in list
тип реализует его, поэтому вам придется переопределить это; простое делегирование вашему методу __getitem__
должно выполняться нормально:
def __getslice__(self, i, j):
return self.__getitem__(slice(i, j))