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.
Расширенные примеры использования
Проверка типов в функциях с аннотациями:
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
Работа с дескрипторами и метаклассами:
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:
from typing import Sized
print(isinstance([1, 2, 3], Sized))
print(isinstance("abc", Sized))
print(isinstance(42, Sized))True True False
Проверка на несколько уровней наследования:
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-данных:
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