[Tutor] Overloading in UserList - Corrected

Daniel Yoo dyoo@hkn.EECS.Berkeley.EDU
Sat, 8 Jul 2000 13:04:13 -0700 (PDT)


On Sat, 8 Jul 2000, jazariel@libero.it wrote:

> I just discovered that the Linux e-mail client kmail
> lost all the identation. Hope it works from the web.

It didn't quite work --- the web email slightly mangled your
ensure() method:

>     def ensure(self, value):
>         """ Method to add a value if it is not already in list """
> 	if not value in self.data:
>     	self.data.append(value)


But in any case, we need to look at part of UserList, specifically, the
__getslice__() method to see why this is happening:

###
    def __getslice__(self, i, j):
        i = max(i, 0); j = max(j, 0)
        userlist = self.__class__()
        userlist.data[:] = self.data[i:j]
        return userlist
###

So it's creating a new instance of the list called userlist, and then
after that it copies the data.  This is where the code is breaking.  The
reason is because your __init__ method in TestList works only if you pass
it a list --- you need to make it work so that:

  mylist = TestList()

is possible.  The way that they made it work in UserList is to give the
parameter a default value:

###
    def __init__(self, list=None):
###

It should be a quick fix to have your TestList have similar
behavior.  Good luck!