From the Python language documentation:
__class__
assignment works only if both classes have the same__slots__
.
So this is expected:
>>> class A: __slots__ = ('x',)
...
>>> class B(A): __slots__ = ('y',)
...
>>> class C: __slots__ = ('x', 'y')
...
>>> B().__class__ = C
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __class__ assignment: 'C' object layout differs from 'B'
>>>
But this is unexpected:
>>> class A: __slots__ = ('x',)
...
>>> class B(A): __slots__ = ()
...
>>> class C: __slots__ = ('x',)
...
>>> B().__class__ = C
>>>
Why isn’t TypeError
raised here?