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
если оба парарамера являются объектом.