John Nagle <na...@animats.com> writes: > On 10/25/2010 7:38 AM, Tim Chase wrote: >> While a dirty hack for which I'd tend to smack anybody who used it...you >> *can* assign to instance.__class__ > > That's an implementation detail of CPython. May not work in > IronPython, Unladen Swallow, PyPy, or Shed Skin. > > (An implementation with a JIT has to trap stores into some > internal variables and invalidate the generated code. > This adds considerable complexity to the virtual machine. > Java JVMs, for example, don't have to support that.)
A Python implementation probably looks up attributes via type late at runtime anyway, so modifying __class__ boils down to changing a reference inside the (moral equivalent of the) PyObject structure. For example, assigning to __class__ appears to work just fine in Jython 2.5.2: Jython 2.5.2rc2 (Release_2_5_2rc2:7167, Oct 24 2010, 22:48:30) [OpenJDK 64-Bit Server VM (Sun Microsystems Inc.)] on java1.6.0_18 Type "help", "copyright", "credits" or "license" for more information. >>> class X(object): ... pass ... >>> class Y(X): pass ... >>> x = X() >>> x.__class__ = Y >>> x <__main__.Y object at 0x3> -- http://mail.python.org/mailman/listinfo/python-list