pythonlistinheritance

How to inherit and extend a list object in Python?


I am interested in using the python list object, but with slightly altered functionality. In particular, I would like the list to be 1-indexed instead of 0-indexed. E.g.:

>> mylist = MyList()
>> mylist.extend([1,2,3,4,5])
>> print mylist[1]

output should be: 1

But when I changed the __getitem__() and __setitem__() methods to do this, I was getting a RuntimeError: maximum recursion depth exceeded error. I tinkered around with these methods a lot but this is basically what I had in there:

class MyList(list):
    def __getitem__(self, key):
        return self[key-1]
    def __setitem__(self, key, item):
        self[key-1] = item

I guess the problem is that self[key-1] is itself calling the same method it's defining. If so, how do I make it use the list() method instead of the MyList() method? I tried using super[key-1] instead of self[key-1] but that resulted in the complaint TypeError: 'type' object is unsubscriptable

Any ideas? Also if you could point me at a good tutorial for this that'd be great!

Thanks!


Solution

  • Use the super() function to call the method of the base class, or invoke the method directly:

    class MyList(list):
        def __getitem__(self, key):
            return list.__getitem__(self, key-1)
    

    or

    class MyList(list):
        def __getitem__(self, key):
            return super(MyList, self).__getitem__(key-1)
    

    However, this will not change the behavior of other list methods. For example, index remains unchanged, which can lead to unexpected results:

    numbers = MyList()
    numbers.append("one")
    numbers.append("two")
    
    print numbers.index('one')
    >>> 1
    
    print numbers[numbers.index('one')]
    >>> 'two'