In Python, the built-in function type() always returns the real class of an instance, except if the instance variable __class__ has been set and the class variable __class__ has not been set, in which case it returns the instance variable __class__. What is the rationale for this exception?
class X:
pass
class A:
__class__ = X
a = A()
print(type(a)) # prints <class '__main__.A'> (the real class)
print(a.__class__) # prints <class '__main__.X'>
class X:
pass
class Y:
pass
class A:
__class__ = X
a = A()
a.__class__ = Y
print(type(a)) # prints <class '__main__.A'> (the real class)
print(a.__class__) # prints <class '__main__.Y'>
class X:
pass
class A:
pass
a = A()
a.__class__ = X
print(type(a)) # prints <class '__main__.X'> (NOT the real class)
print(a.__class__) # prints <class '__main__.X'>