downcasting problem
Hrvoje Niksic
hniksic at xemacs.org
Tue Oct 26 05:21:07 EDT 2010
John Nagle <nagle at 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>
More information about the Python-list
mailing list