Сообщить об ошибке.

Функция isinstance() в Python, принадлежность экземпляра к классу.

Позволяет проверить принадлежность экземпляра к классу.

Синтаксис:

isinstance(object, classinfo)

Параметры:

  • object - объект, требующий проверки,
  • classinfo - класс, кортеж с классами или рекурсивный кортеж кортежей.

Возвращаемое значение:

  • bool.

Описание:

Функция isinstance() вернет True, если проверяемый объект object является экземпляром указанного класса (классов) или его подкласса (прямого, косвенного или виртуального).

Если объект object не является экземпляром данного типа, то функция всегда возвращает False.

Функцией isinstance() можно проверить класс, кортеж с классами, либо рекурсивный кортеж кортежей. Другие типы последовательностей аргументом classinfo не поддерживаются.

Если аргумент classinfo не является классом, либо кортежем с классами, то возбуждается исключение TypeError.

Примеры проверок принадлежности экземпляра к классу.

Взгляните на следующий код:

>>> a = 3
>>> isinstance(a, object)
# True
>>> type(a) == object
# False
>>> issubclass(type(a), object)
# True

Молодые программисты часто не понимают что здесь происходит. Давайте разбираться...

Функция type() с одним аргументом object возвращает тип объекта - точный класс, из которого был создан переданный аргумент object. Мы знаем, что все целые числа в Python являются типом int. Это означает, что проверка объекта type(3) == object в точности эквивалентна проверке объекта int == object, что однозначно неверно.

В Python, как это известно - все является объектом, следовательно дочерний класс (в данном случае int) наследуется от родительского (в данном случае object) и считается, что такое поведение имеет отношение is a. Отношение is a - это то, что проверяет функция isinstance().

Существует аналогичная функция issubclass() для проверки того же отношения, только для класса вместо экземпляра этого класса. В большинстве случаев isinstance(x, y) == issubclass(type(x), y).

Классы всегда имеют одну и ту же ссылку в ​​одной сессии интерпретатора, поэтому можно использовать оператор is вместо оператора == для сравнения. Таким образом, type(3) is int будет истинным.

Изобразим сказанное выше на примере:

class Base:
    def __init__(self):
        self.foo='foo'

class Sub(Base):
    def __init__(self):
        super().__init__()

>>> obj = Base()
>>> sub_obj = Sub()
>>> isinstance(obj, Base)
# True
>>> isinstance(obj, Sub)
# False
>>> isinstance(sub_obj, Base)
# True
>>> isinstance(sub_obj, Sub)
# True
>>> type(sub_obj) == Base
# False
>>> type(sub_obj)
# <class '__main__.Sub'>
>>> type(sub_obj) == Sub
# True
>>> issubclass(type(sub_obj), Base)
# True

Общие приемы проверок.

>>> x = 1
>>> isinstance(x, int)
# True
>>> x = [1, 2, 3]
>>> isinstance(x, list)
# True
>>> x = (1, 2, 3)
>>> isinstance(x, tuple)
# True

# Проверим, является ли строка 'Hello' одним из типов, описанных в параметре type
>>> isinstance('Hello', (float, int, str, list, dict, tuple))
# True

# Проверка, на принадлежность к экземпляром myObj
class myObj:
  name = "John"

y = myObj()
>>> isinstance(y, myObj)
# True