I want to implement a custom list class in Python as a subclass of list
. What is the minimal set of methods I need to override from the base list
class in order to get full type compatibility for all list operations?
This question suggest that at least __getslice__
needs to be overridden. From further research, also __add__
and __mul__
will be required. So I have this code:
class CustomList(list):
def __getslice__(self,i,j):
return CustomList(list.__getslice__(self, i, j))
def __add__(self,other):
return CustomList(list.__add__(self,other))
def __mul__(self,other):
return CustomList(list.__mul__(self,other))
The following statements work as desired, even without the overriding methods:
l = CustomList((1,2,3))
l.append(4)
l[0] = -1
l[0:2] = CustomList((10,11)) # type(l) is CustomList
These statements work only with the overriding methods in the above class definition:
l3 = l + CustomList((4,5,6)) # type(l3) is CustomList
l4 = 3*l # type(l4) is CustomList
l5 = l[0:2] # type(l5) is CustomList
The only thing I don't know how to achieve is making extended slicing return the right type:
l6 = l[0:2:2] # type(l6) is list
What do I need to add to my class definition in order to get CustomList
as type of l6
?
Also, are there other list operations other than extended slicing, where the result will be of list
type instead of CustomList
?
CustomList
is intended to hold data of a specific type, and will have additional parameters and methods applying to these data (which I left out for the question). – silvadoitems = datalist.items
:) – Zaur Nasibov