Isinstance: примеры (PYTHON)

Использование функции isinstance в языке Python
Раздел: Встроенные функции, Интроспекция
isinstance(object: any, classinfo: type): bool

Описание функции isinstance

Функция isinstance() является встроенной в Python и предназначена для проверки принадлежности объекта указанному классу или типу данных. Основное применение заключается в определении типа объекта во время выполнения программы, что позволяет реализовать полиморфизм и обеспечить корректную обработку данных разных типов.

Сигнатура функции: isinstance(object, classinfo).

  • object - обязательный аргумент, представляющий проверяемый объект.
  • classinfo - обязательный аргумент, который может быть классом, типом, кортежем классов/типов или абстрактным базовым классом из модуля collections.abc. Если передан кортеж, функция проверяет, принадлежит ли объект хотя бы к одному из перечисленных классов.

Возвращаемое значение: True, если объект является экземпляром класса classinfo или его подкласса, иначе False. Для абстрактных базовых классов функция проверяет соответствие виртуальной иерархии типов.

Использование функции целесообразно в ситуациях проверки типа входящих данных, обработки разнотипных аргументов, реализации паттернов проектирования, а также для валидации в контексте утиной типизации.

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

Простая проверка типа данных:

print(isinstance(42, int))
print(isinstance(3.14, float))
print(isinstance("текст", str))
print(isinstance([1, 2], list))
print(isinstance({"key": "value"}, dict))
True
True
True
True
True

Проверка с кортежем типов:

value = [10, 20]
print(isinstance(value, (list, tuple, set)))
True

Проверка наследования классов:

class Parent:
    pass

class Child(Parent):
    pass

obj = Child()
print(isinstance(obj, Child))
print(isinstance(obj, Parent))
True
True

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

from collections.abc import Iterable
print(isinstance([1, 2, 3], Iterable))
print(isinstance(123, Iterable))
True
False

Похожие функции в Python

В Python существует несколько способов проверки типов:

  • type(obj) - возвращает точный тип объекта. Отличие от isinstance() заключается в том, что type() не учитывает наследование. type(obj) is int вернет True только для объектов типа int, но не для его подклассов.
  • issubclass(cls, classinfo) - проверяет, является ли класс cls подклассом classinfo. Работает с классами, а не с объектами.

Функция isinstance() часто предпочтительнее type() из-за поддержки наследования. type() используется, когда требуется точное совпадение типа. issubclass() применяется для проверки отношений между классами.

Аналоги функции в других языках

Концепция проверки типов присутствует в большинстве языков программирования.

JavaScript: оператор instanceof.

console.log([] instanceof Array);
console.log([] instanceof Object);
true
true

PHP: оператор instanceof.

$obj = new stdClass();
var_dump($obj instanceof stdClass);
bool(true)

Java: оператор instanceof.

Object str = "test";
System.out.println(str instanceof String);
true

C#: оператор is.

object value = 5;
Console.WriteLine(value is int);
True

Go: утверждение типа с проверкой.

var i interface{} = "hello"
_, ok := i.(string)
fmt.Println(ok)
true

Kotlin: оператор is.

val obj: Any = "example"
println(obj is String)
true

Lua: отсутствует встроенный оператор, используются функции.

function isInstance(obj, class)
    return type(obj) == class
end
print(isInstance({}, "table"))
true

SQL: проверка типов зависит от конкретной СУБД, часто через системные представления.

Типичные ошибки при использовании

Передача несуществующего класса в classinfo:

print(isinstance(5, NotDefinedClass))
NameError: name 'NotDefinedClass' is not defined

Использование isinstance() с примитивами других языков может быть неочевидным. В Python все является объектом, включая числа и строки.

Путаница между isinstance() и type():

class MyInt(int):
    pass

obj = MyInt(5)
print(isinstance(obj, int))
print(type(obj) is int)
True
False

Некорректная проверка типов, связанных с итерируемыми объектами, без учета абстрактных базовых классов.

Изменения в функции isinstance

В Python 3.10 было добавлено упрощение синтаксиса проверки типов в структурном сопоставлении шаблонов (match/case), но сама функция isinstance() не претерпела значительных изменений. В версии 3.6 улучшена интеграция с модулем typing и абстрактными базовыми классами. Важно отметить, что в Python 3 isinstance(True, int) возвращает True, так как bool является подклассом int, что отличается от поведения в Python 2.

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

Проверка типов в функциях с аннотациями:

Пример python
def process(data):
    if not isinstance(data, (list, tuple)):
        raise TypeError("Expected list or tuple")
    return sum(data)

try:
    print(process([1, 2, 3]))
    print(process("not a list"))
except TypeError as e:
    print(f"Error: {e}")
6
Error: Expected list or tuple

Работа с дескрипторами и метаклассами:

Пример python
from numbers import Integral

class OnlyIntegers:
    def __set_name__(self, owner, name):
        self.name = name
    def __set__(self, instance, value):
        if not isinstance(value, Integral):
            raise ValueError("Only integer values allowed")
        instance.__dict__[self.name] = value

class TestClass:
    field = OnlyIntegers()

tc = TestClass()
tc.field = 10
print(tc.field)
tc.field = "text"  # Вызовет исключение
10
ValueError: Only integer values allowed

Использование с протоколами из модуля typing:

Пример python
from typing import Sized
print(isinstance([1, 2, 3], Sized))
print(isinstance("abc", Sized))
print(isinstance(42, Sized))
True
True
False

Проверка на несколько уровней наследования:

Пример python
class A:
    pass
class B(A):
    pass
class C(B):
    pass

obj = C()
print(isinstance(obj, A))
print(isinstance(obj, B))
print(isinstance(obj, C))
print(isinstance(obj, (A, str, dict)))
True
True
True
True

Применение в обработке JSON-данных:

Пример python
import json

def json_safe_sum(data):
    total = 0
    if isinstance(data, dict):
        for value in data.values():
            total += json_safe_sum(value)
    elif isinstance(data, list):
        for item in data:
            total += json_safe_sum(item)
    elif isinstance(data, (int, float)):
        total += data
    return total

json_str = '{"a": [1, 2, {"b": 3}], "c": 4}'
data = json.loads(json_str)
print(json_safe_sum(data))
10

питон isinstance function comments

En
Isinstance Check object type