You need to provide custom __getitem__()
, __setitem__
and __delitem__
hooks.
These are passed a slice object when slicing the list; these have start
, stop
and step
attributes. However, these values could be None
, to indicate defaults. Take into account that the defaults actually change when you use a negative stride!
However, they also have a slice.indices()
method, which when given a length produces a tuple of (start, stop, step)
values suitable for a range()
object. This method takes care of such pesky details as slicing with a negative strides and no start or stop indices:
def __getitem__(self, key):
if isinstance(key, slice):
indices = range(*key.indices(len(self.list)))
return [self.list[i] for i in indices]
return self.list[key]
or, for your case:
def __getitem__(self, key):
return self.list[key]
because a list
can take the slice
object directly.
In Python 2, list.__getslice__
is called for slices without a stride (so only start and stop indices) if implemented, and the built-in list
type implements it so you'd have to override that too; a simple delegation to your __getitem__
method should do fine:
def __getslice__(self, i, j):
return self.__getitem__(slice(i, j))
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…