isinstance(тип, объект) = правда, почему?

Я понимаю, что объект является экземпляром типа, а тип наследуется от объекта. Таким образом, следующие отношения имеют смысл:

isinstance(object, type)            # returns True, ok
issubclass(type, object)            # returns True, ok

Я также знаю, что isinstance (a, b) проверяет, является ли a экземпляром b или его баз. Итак, следующее тоже имеет смысл:

isinstance(type, type)              # returns True because it is translated to ....
isinstance(type, object)            # which is True

Я не могу понять, почему следующие утверждения возвращают True.

isinstance(type, object)            # returns True, but why?
isinstance(object, object)          # returns True, but why?

Дай мне знать, если знаешь. Благодарю.

2 ответа

object является корнем иерархии классов, так что это конечный родительский класс каждого типа, включая type а также object, Что делает object его собственный родительский класс, что является одной из причин, почему вы не могли определить object только на Python; его нужно перетаскивать с ног на голову реализацией Python.

type является классом, и все (встроенные) классы являются экземплярами метакласса type, (Да, type это свой собственный метакласс.) И так как object это базовый класс type, следовательно type это пример object,

Все в Python является объектом. По умолчанию все объекты являются экземплярами суперкласса объектов, поэтому instance(type, object возвращается True

классобъекта находится в верхней части иерархии объектов. Даже если A является прямым потомком B (в приведенном ниже примере) и оба являются косвенными потомками объекта.

Метод isinstance() закодирован таким образом, что возвращает True если оба параметра являются объектами. В других случаях он проверяет, является ли первый параметр экземпляром второго параметра или нет.

Пожалуйста, посмотрите на приведенный ниже пример кода.

class A:
       pass

class B(A):
        pass

a = A()
b = B()

print(isinstance (a, A)) # True
print(isinstance (b, B)) # True
print(isinstance (b, A)) # True
print(isinstance (a, B)) # False

print(isinstance (a, object)) # True
print(isinstance (b, object)) # True
print(isinstance (A, object) ) # True
print(isinstance (B, object)) # True

Объект является экземпляром объекта.

print(isinstance (object, object)) # True

A не является экземпляром A, то же самое относится и к B.

print(isinstance (B, B)) # False
print(isinstance (A, A)) # False

Следующий код выдает ошибку, поскольку вторым параметром должно быть имя класса.

print(isinstance (a, a)) 
"""
print(isinstance (a, a)) 
TypeError: isinstance() arg 2 must be a type or tuple of 
types
"""

print(isinstance (b, b)) 
"""
print(isinstance (b, b)) 
TypeError: isinstance() arg 2 must be a type or tuple of  
types
"""

Так что все дело в логике кода или реализации метода isinstance(), который он возвращает True если оба парарамера являются объектом.

Другие вопросы по тегам