Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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

like image 247
attaboyabhipro Avatar asked Apr 16 '13 09:04

attaboyabhipro


2 Answers

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)) 
like image 94
Martijn Pieters Avatar answered Oct 05 '22 21:10

Martijn Pieters


class MyList(list):     def __init__(self, lst):         self.list = lst 

doesn't make much sense... self is the list object itself, and it has already been created at this point, maybe you want to override __new__, however you probably don't need to touch that. Anyway you want to override __getitem__ like so:

def __getitem__(self, val):     if isinstance( val, slice):         # do stuff here 
like image 34
jamylak Avatar answered Oct 05 '22 21:10

jamylak