In Python 2.2.2 you can set __class__, as long as __class__ has a compatible instance lay-out (at the C implementation level).
This is the part where I am confused. How do I know if something is an old or new style object? Do new-style objects derive from built-in types (object/dict..)
Yes. Please re-read http://www.python.org/2.2.2/descrintro.html
Use new-style classes and you'll be much happier: you can invoke the superclass __setattr__ to do the magic.
I've tried this, but then I was unable to create any of the old-style classes. Is there any solution that would let me mutate an object into both? I suspect not. Then the question is:
No, you can never switch an object from classic to new-style.
- is there a runtime/compiling python flag to force all objects into new-style layout? This will be the future, I think I've read somewhere.
Almost. You can add __metaclass__=type to the top of each module, and then classes without a base class will become new-style. Classes derived from other classes will still be whatever that other class is; and there's no way to force the whole standard library to use new-style classes (amongst many reasons, exceptions must be classic classes).
- how can I tell the difference between old and new programatically?
type(C) == types.Classtype. Or check if the class has a __class__ attribute (classic classes don't). --Guido van Rossum (home page: http://www.python.org/~guido/)