Marcus Goldfish wrote: > Hi, > > I ran across a strange problem using mulitple inheritance that I hope > someone can explain. Basically, I am implementing a Publisher pattern, > and when I try to add threading, the order I list Base classes matters! > Here is the short sample code-- all help explaining this is appreciated! > > Thanks, > Marcus > > --- > import threading > > class Publisher(object): > def __init__(self): self.listeners = {} > def register(self, id, object): > self.listeners[id] = self.listeners.get(id, object) > > > # This *FAILS* with AttributeError: 'FancyPublisher' > # object has no attribute 'listeners' > class FancyPublisher(threading.Thread, Publisher): > def __init__(self): > super(FancyPublisher, self).__init__() > > F = FancyPublisher() > F.register('me', None) > > > # However, this succeeds!? > class FancyPublisher(Publisher, threading.Thread): > def __init__(self): > super(FancyPublisher, self).__init__() > > F = FancyPublisher() > F.register('me', None)
Wow, the third (sort of) threading question in a week! The problem is that neither Publisher nor threading.Thread calls super(...).__init__() in *its* __init__() method, so you are only initializing one of your base classes. I don't think your second FancyPublisher would work when you actually tried to run it as a thread. One solution is to just call both base class __init__() methods directly: class FancyPublisher(Publisher, threading.Thread): def __init__(self): FancyPublisher.__init__(self) threading.Thread.__init__(self) I think it would also work if Publisher.__init__ called super(Publisher, self).__init__() and Publisher is the first base class. This essay highlights some pitfalls with super() including the one you found: http://fuhm.net/super-harmful/ though it provoked a strong response on python-dev: http://mail.python.org/pipermail/python-dev/2005-January/050656.html Kent _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor