Что делает метод isinstance в python?
Функция isinstance() принимает в качестве аргументов какой-либо объект и тип данных, а затем проверяет соответствие одного другому. В случае соответствия возвращает True , при несоответствии возвращает False :
x = isinstance(5, int) print(x) # => True
Вторым аргументом может быть не один тип данных, а сразу несколько, объединенных в кортеж. Функция вернет True , если объект принадлежит хотя бы к одному из них:
x = isinstance(5, (int, str, list, tuple, bool)) print(x) # => True
Помимо этого функция isinstance() проверяет, принадлежит ли объект указанному классу:
class myObj: name = "John" y = myObj() x = isinstance(y, myObj) print(x) # => True
Функции isinstance и type для проверки типов данных
На этом занятии мы поговорим о функции isinstance(), с помощью которой можно выполнять проверку на принадлежность объекта определенным типам данных.
Например, объявим переменную:
a = 5
и для нее вызовем функцию isinstance(), следующим образом:
isinstance(a, int)
Увидим значение True, так как переменная a действительно ссылается на целочисленный объект. А вот если указать:
isinstance(a, float)
то уже будет возвращено значение False. Вот так в самом простом варианте работает эта функция. Но у нее есть один нюанс, связанный с булевым типом данных. Если определить переменную:
b = True
то, очевидно, функция:
isinstance(b, bool)
вернет значение True. Однако, если вместо bool записать int:
isinstance(b, int)
то тоже увидим True. Это связано с особенностью реализацией типа bool. Не буду углубляться в эти детали, здесь просто достаточно запомнить этот момент. Но тогда спрашивается, а как отличать тип bool от типа int? Если нужна строгая проверка на типы, то лучше использовать знакомую нам функцию type() с проверкой на равенство:
type(b) == bool
или, используя оператор is:
type(b) is bool
Эта функция различает булевы типы от целочисленных:
type(b) is int
Или, если мы хотим произвести множественную проверку, то воспользоваться оператором in:
type(b) in (bool, float, str)
Здесь мы сразу проверяем переменную b на три типа данных.
Сейчас у вас может возникнуть вопрос, зачем нужна функция isinstance(), если проверку типов можно делать функцией type()? В целом, они действительно очень похожи, но isinstance() в отличие от type() делает проверку с учетом иерархии наследования объектов и была разработана для проверки принадлежности объекта тому или иному классу:

Например, тип bool наследуется от int, поэтому isinstance() выдает True для обоих типов, когда b – булева переменная. А функция type() даст True только для типа bool. То есть, здесь проверка происходит без учета иерархии. (Я сейчас не буду углубляться и объяснять, что такое наследование – это уже раздел ООП и предмет отдельного курса).
Теперь, когда мы в целом познакомились с работой функции isinstance(), давайте рассмотрим следующий пример. Предположим, что у нас есть кортеж с произвольными данными:
data = (4.5, 8.7, True, "книга", 8, 10, -11, [True, False])
И наша задача вычислить сумму всех вещественных чисел этой коллекции. Для этого, очевидно, вначале каждый элемент кортежа нужно проверить на вещественный тип данных, а затем, выполнять суммирование. Я вначале сделаю это через обычный цикл for:
s = 0 for x in data: if isinstance(x, float): s += x print(s)
Как видите, у нас получилась нужная сумма. Но эту же задачу можно реализовать лучше, с использованием ранее рассмотренной функции filter():
s = sum(filter(lambda x: isinstance(x, float), data))
Видите, все записано в одну строчку и, кроме того, работает быстрее, так как используются встроенные функции вместо цикла for.
А вот если мы попробуем вычислить сумму целочисленных значений, просто изменив тип данных:
s = sum(filter(lambda x: isinstance(x, int), data))
то увидим неверное значение 8, так как в коллекции data присутствует булево значение True, которое интерпретируется как целое число 1. Здесь лучше применять строгую проверку с использованием функции type():
s = sum(filter(lambda x: type(x) is int, data))
Теперь видим верное значение 7.
С помощью функции isinstance() можно делать и множественные проверки. Например, мы хотим определить, относится ли число к целому или вещественному типу данных? Для этого достаточно записать кортеж из этих типов:
a = 5.5 isinstance(a, (int, float))
Это эквивалентно записи:
isinstance(a, int) or isinstance(a, float)
Но первый вариант короче и потому чаще используется на практике.
Вот так в Python можно выполнять проверку типов данных для произвольных объектов. А также знаете отличия между работой функций isinstance() и type(). До встречи на следующем уроке.
Видео по теме

#1. Первое знакомство с Python Установка на компьютер

#2. Варианты исполнения команд. Переходим в PyCharm

#3. Переменные, оператор присваивания, функции type и id

#4. Числовые типы, арифметические операции

#5. Математические функции и работа с модулем math

#6. Функции print() и input(). Преобразование строк в числа int() и float()

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

#8. Введение в строки. Базовые операции над строками

#9. Знакомство с индексами и срезами строк

#10. Основные методы строк

#11. Спецсимволы, экранирование символов, row-строки

#12. Форматирование строк: метод format и F-строки

#13. Списки — операторы и функции работы с ними

#14. Срезы списков и сравнение списков

#15. Основные методы списков

#16. Вложенные списки, многомерные списки

#17. Условный оператор if. Конструкция if-else

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

#19. Тернарный условный оператор. Вложенное тернарное условие

#20. Оператор цикла while

#21. Операторы циклов break, continue и else

#22. Оператор цикла for. Функция range()

#23. Примеры работы оператора цикла for. Функция enumerate()

#24. Итератор и итерируемые объекты. Функции iter() и next()

#25. Вложенные циклы. Примеры задач с вложенными циклами

#26. Треугольник Паскаля как пример работы вложенных циклов

#27. Генераторы списков (List comprehensions)

#28. Вложенные генераторы списков

#29. Введение в словари (dict). Базовые операции над словарями

#30. Методы словаря, перебор элементов словаря в цикле

#31. Кортежи (tuple) и их методы

#32. Множества (set) и их методы

#33. Операции над множествами, сравнение множеств

#34. Генераторы множеств и генераторы словарей

#35. Функции: первое знакомство, определение def и их вызов

#36. Оператор return в функциях. Функциональное программирование

#37. Алгоритм Евклида для нахождения НОД

#38. Именованные аргументы. Фактические и формальные параметры

#39. Функции с произвольным числом параметров *args и **kwargs

#40. Операторы * и ** для упаковки и распаковки коллекций

#41. Рекурсивные функции

#42. Анонимные (lambda) функции

#43. Области видимости переменных. Ключевые слова global и nonlocal

#44. Замыкания в Python

#45. Введение в декораторы функций

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

#47. Импорт стандартных модулей. Команды import и from

#48. Импорт собственных модулей

#49. Установка сторонних модулей (pip install). Пакетная установка

#50. Пакеты (package) в Python. Вложенные пакеты

#51. Функция open. Чтение данных из файла

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

#53. Запись данных в файл в текстовом и бинарном режимах

#54. Выражения генераторы

#55. Функция-генератор. Оператор yield

#56. Функция map. Примеры ее использования

#57. Функция filter для отбора значений итерируемых объектов

#58. Функция zip. Примеры использования

#59. Сортировка с помощью метода sort и функции sorted

#60. Аргумент key для сортировки коллекций по ключу

#61. Функции isinstance и type для проверки типов данных

#62. Функции all и any. Примеры их использования

#63. Расширенное представление чисел. Системы счисления

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

#65. Модуль random стандартной библиотеки

#66. Аннотация базовыми типами

#67. Аннотации типов коллекций

#68. Аннотации типов на уровне классов

#69. Конструкция match/case. Первое знакомство

#70. Конструкция match/case с кортежами и списками

#71. Конструкция match/case со словарями и множествами

#72. Конструкция match/case. Примеры и особенности использования
© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта
Отличие type от isinstance
Хотя функция type() возвращает тип переданного аргумента, с ее помощью можно проверить, принадлежит ли аргумент тому или иному типу:
>>> a = 10 >>> b = [1,2,3] >>> type(a) == int True >>> type(b) == list True >>> type(a) == float False
В отличие от type() , функция isinstance() специально создана для проверки принадлежности данных определенному классу (типу данных):
>>> isinstance(a,int) True >>> isinstance(b,list) True >>> isinstance(b,tuple) False >>> c = (4,5,6) >>> isinstance(c,tuple) True
Кроме того isinstance() по сравнению с type() позволяет проверить данное на принадлежность хотя бы одному типу из кортежа, переданного в качестве второго аргумента:
>>> isinstance(a,(float, int, str)) True >>> isinstance(a,(list, tuple, dict)) False
Другое отличие isinstance() . Эта функция поддерживает наследование. Для isinstance() экземпляр производного класса также является экземпляром базового класса. Для type() это не так:
>>> class A (list): . pass . >>> a = A() >>> type(a) == list False >>> type(a) == A True >>> isinstance(a,A) True >>> isinstance(a,list) True
isinstance
Возвращает флаг, указывающий на то, является ли указанный объект экземпляром указанного класса (классов).
isinstance(obj, classinfo)
obj — Объект, требующий проверки.
classinfo — Класс, либо кортеж с классами, либо рекурсивный кортеж кортежей. Другие типы последовательностей не поддерживаются. Если аргумент не является классом, либо кортежем с классами, возбуждается TypeError.
Возвращает True , если указанный объект является экземпляром указанного класса (классов), либо наследующегося от него класса.
isinstance(1, int) # True
isinstance('some', str) # True
isinstance(1.7, float) # True
Работа функции и import
То, каким образом импортируется модуль, содержащий объект [и/или классы], передаваемый в isinstance , может влиять на результат функции — смотрите «Как же так isinstance не работает?!».