Это старый вопрос, но ни один из ответов, кажется, не упоминает об этом. в общем случае для класса нового стиля IS возможно иметь разные значения для type(instance)
и instance.__class__
:
class ClassA(object):
def display(self):
print("ClassA")
class ClassB(object):
__class__ = ClassA
def display(self):
print("ClassB")
instance = ClassB()
print(type(instance))
print(instance.__class__)
instance.display()
Выход:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
Причина в том, что ClassB
переопределяет дескриптор __class__
, однако поле внутреннего типа в объекте не изменяется. type(instance)
читает непосредственно из этого поля типа, поэтому возвращает правильное значение, тогда как instance.__class__
относится к новому дескриптору, заменяющему оригинальный дескриптор, предоставленный Python, который читает внутреннее поле типа. Вместо того, чтобы читать это внутреннее поле типа, он возвращает жестко закодированное значение.