How to override the slice functionality of list in its derived class

list, overriding, python

Solution

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))

Problem

I make a class like below: ``` class MyList(list): def __init__(self, lst): self.list = lst ``` I want slice functionality to be overridden in MyList

Original source

Related problems