Oops...
Just finished sending my earlier response and realize that I overlooked an issue. The code from http://viner.tv/go?set is potentially errant. When invoking the base class constructor, self should have been explcitly sent as a parameter, using the syntax class Set(list): def __init__(self, value = []): list.__init__(self) self.concat(value) # copies mutable default I had gotten sidetracked by the issue of why value was not being explicitly sent. This explains in part why the original author used the syntax list.__init__([]) with an empty list as the parameter to __init__. That makes such a command legal, but the call is entirely pointless, as it invokes the initializer on a different instance than the one that we are currently responsible for initializing. I suspect that the code as written is faulty because the internal state of the list is not necessarily properly initialized. However, since list is a built-in class, it is possible that the author of this code is getting lucky because initialization of a Python list may be happening by other means than list.__init__ This example is certainly not a proper use of inheritance. With regard, Michael On Thursday November 15, 2007, Michael H. Goldwasser wrote: > > On Thursday November 15, 2007, Tom wrote: > > > I am trying to understand what happens in the following scenario: > > > > class Sub_class(Base_class): > > def __init__(self, data): > > Base_class.__init__(self, data) > > > > as in: > > > > # snippet from http://viner.tv/go?set > > class Set(list): > > def __init__(self, value = []): > > list.__init__([]) > > > Tom, > > Indeed, that first line of the Set constructor body is invoking the > constructor for the base class (list, in this case). The reason > that the value parameter is NOT being directly sent to the base > class is that there is a desire to avoid allowing potentially > duplicate elements into something that is representing a set. > > However, it was entirely unnecessary for them to send an empty list > as a parameter. It would suffice to have written > > list.__init__() > > It is important to have the call to the base class initializer > because we need to allow for the internal state of the underlying > list to be properly intitialized. > > Please note that the original source for this from viner.tv > has an important fourth line: > > class Set(list): > def __init__(self, value = []): > list.__init__([]) > self.concat(value) # copies mutable default > > That fourth line uses a custom method defined later to insert > designated values into the set while making sure to avoid > duplicates. > > With regard, > Michael > > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor