Они передаются объект среза при разрезании списка; они имеют атрибуты 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))
Ответ 2
class MyList(list):
def __init__(self, lst):
self.list = lst
не имеет большого смысла... self - это сам объект списка, и он уже создан на этом этапе, возможно, вы хотите переопределить __new__, однако вам, вероятно, не нужно касаться этого, В любом случае вы хотите переопределить __getitem__ следующим образом:
def __getitem__(self, val):
if isinstance( val, slice):
# do stuff here