Перейти к содержимому

Isinstance python что это

  • автор:

Что делает метод 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 не работает?!».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *