difference 2.3 versus 2.2

"Martin v. Löwis" martin at v.loewis.de
Thu Jan 23 09:05:16 CET 2003

Michele Simionato wrote:
> TypeError: __class__ assignment: only for heap types
> Can somebody put some light on this TypeError ? 
> It looks like intentional.
> I can change class of a normal object, why not the class of a class ?

You can't change the class of arbitrary normal objects:

 >>> (2).__class__=float
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
TypeError: __class__ assignment: 'float' object layout differs from 'int'

In 2.3, this rules was tightened that not only the layout must be 
compatible, but both old and new type must be "heap types", i.e. created 
through a class statement. Without this restriction, 2.3 would have 
allowed to write

(2).__class__ = bool

which would have cheated the constructor of the bool type.

In your example, the old type of the object is TypeType, which is not a 
heap type.


More information about the Python-list mailing list