D'oh... I just realized why this is happening. It is clear in the longhand as you say, but I don't think in the way you descibed it (or I'm so far gone right now I have lost it).
self.I += 1 is the same as self.I = self.I + 1 and when python tries figures out what the 'self.I' is on the right hand side. it of course ends up having to move up to the base class foo.__dict__ because there is no 'I' in self.__dict__ yet. So it ends up effectively being: self.I = foo.I + 1 which explains where the "self.I = foo.I' that I was claiming was being done magically comes from. What my head was thinking was that the 'self.I' lookup would move up to get foo.__dict__['I'], and that I would effectively get 'foo.I += 1', but this is a bit of a brain fart and is just plain wrong. I should have seen that earlier... oh well. I'm happy that it is perfectly clear where it comes from, now. It still does look odd when you do a simplistic comparison of the behaviour of 'x += 1' and 'self.I += 1', but I suppose that that's just the way the lookup scheme crumbles. An unfortunate (and rare?) quirk, I guess. It still might be nice were python to just block out this potential confusion with an Exception... it seems that class vs instance attribute referencing is confusing enough for people without having this type of potential confusion lurking around the syntax. It seems like such a simple thing, but to understand the outcomes requires knowing how the name lookup scheme works, how mutable/immutable objects are dealt with, and what the += keystroke-saver/macro operator is actually doing. That this is stuff that someone coding in python should understand could certainly be argued, though... Russ -- http://mail.python.org/mailman/listinfo/python-list