isinstance

Функция isinstance() проверяет, принадлежит ли объект указанному классу или кортежу классов. Возвращает True, если объект соответствует, и False в противном случае.

Синтаксис

isinstance(object, classinfo)

Аргументы

  • object:
    • Что означает: Объект, который нужно проверить.
    • Возможные значения: Любой объект.
  • classinfo:
    • Что означает: Класс, тип или кортеж классов и типов, с которыми нужно сравнить объект.
    • Возможные значения: Один класс или кортеж, содержащий классы, или Union, содержащий классы.

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

Возвращает True, если объект принадлежит указанному классу (или одному из классов из кортежа). Иначе возвращает False.

Примеры использования

# Проверка принадлежности числу
print(isinstance(42, int))  # True
# Проверка принадлежности строке
print(isinstance("hello", str))  # True
# Проверка вхождения в несколько классов
print(isinstance(3.14, (int, float)))  # True
# Проверка пользовательского класса
class MyClass:
    pass

obj = MyClass()
print(isinstance(obj, MyClass))  # True

Эквивалентный код

def pyplanet_isinstance(obj, classinfo):
    if isinstance(classinfo, tuple):
        return any(pyplanet_isinstance(obj, cls) for cls in classinfo)
    return obj.__class__ is classinfo or issubclass(obj.__class__, classinfo)

Частые ошибки

  1. Передача некорректного второго аргумента:

    print(isinstance(42, [int, float]))  # Ошибка: TypeError
    

    Как исправить: Используйте кортеж вместо списка:

    print(isinstance(42, (int, float)))  # True
    
  2. Ошибочное ожидание проверки содержимого коллекций:

    data = [1, 2, 3]
    print(isinstance(data, int))  # False
    

    Как исправить: Проверяйте тип элемента коллекции с помощью цикла или функций вроде all/map:

    print(all(isinstance(i, int) for i in data))  # True
    
  3. Проблемы с наследованием:

    class Parent:
        pass
    
    class Child(Parent):
        pass
    
    obj = Child()
    print(isinstance(obj, Parent))  # True
    

    Убедитесь, что вы понимаете принцип работы наследования в Python.

Часто задаваемые вопросы

  1. Что произойдет, если объект не принадлежит указанному классу? Вернется False:

    print(isinstance(42, str))  # False
    
  2. Можно ли передать несколько классов? Да, передайте их в виде кортежа:

    print(isinstance(3.14, (int, float)))  # True
    
  3. Как проверить пользовательский класс? Используйте имя класса, как с встроенными типами:

    class MyClass:
        pass
    
    obj = MyClass()
    print(isinstance(obj, MyClass))  # True
    
  4. Работает ли isinstance() с наследованием? Да, если объект является экземпляром дочернего класса, проверка родительского класса вернет True:

    class Parent:
        pass
    
    class Child(Parent):
        pass
    
    obj = Child()
    print(isinstance(obj, Parent))  # True
    
  5. Подходит ли isinstance() для проверки всех элементов коллекции? Нет, нужно использовать цикл или функции all и map:

    data = [1, 2, 3]
    print(all(isinstance(i, int) for i in data))  # True