Отличие 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 не работает?!».
Как проверить является ли объект экземпляром класса python
Функции isinstance() и issubclass() в Python
04 мая 2023
Оценки статьи
Еще никто не оценил статью
Python предоставляет две встроенные функции для проверки типов: isinstance() и issubclass() . Эти функции позволяют проверить, является ли объект экземпляром класса или является ли класс наследником другого класса.
Функция isinstance()
Функция isinstance() проверяет, является ли заданный объект экземпляром заданного класса или наследником от него. Синтаксис функции выглядит следующим образом:
isinstance(object, classinfo)
где:
- object : Обязательный параметр, объект, тип которого необходимо проверить.
- classinfo : Обязательный параметр, класс или кортеж классов, с которыми необходимо сравнить тип объекта.
Пример использования isinstance()
class MyClass: pass class MySubclass(MyClass): pass obj = MySubclass() print(isinstance(obj, MySubclass)) # True print(isinstance(obj, MyClass)) # True print(isinstance(obj, int)) # False
В данном примере мы создали класс MyClass и наследник от него MySubclass . Создали объект obj от класса MySubclass . Затем мы проверили, является ли obj экземпляром класса MySubclass , класса MyClass и int .
Функция issubclass()
Функция issubclass() проверяет, является ли один класс наследником другого. Синтаксис функции выглядит следующим образом:
issubclass(class, classinfo)
где:
- class : Обязательный параметр, класс, который необходимо проверить на принадлежность к classinfo .
- classinfo : Обязательный параметр, класс или кортеж классов, с которыми необходимо сравнить class .
Пример использования issubclass()
class MyClass: pass class MySubclass(MyClass): pass print(issubclass(MySubclass, MyClass)) # True print(issubclass(MyClass, MySubclass)) # False print(issubclass(MySubclass, object)) # True
В данном примере мы создали класс MyClass и его наследник MySubclass . Затем мы проверили, является ли MySubclass наследником класса MyClass и object .
Обе функции могут быть полезны во многих сценариях, особенно при написании кода с большим количеством классов и наследников. Они помогают удостовериться в правильности типа объекта или класса, прежде чем выполнять дальнейшие операции с ними.
Заключение
В заключении, функции isinstance() и issubclass() очень полезны при работе с классами и объектами в Python. Они позволяют проверять типы и иерархии наследования классов, что может быть полезным при отладке и тестировании кода.
Меню категорий
-
Загрузка категорий.
Добро пожаловать в Блог Разработчика Владислава Александровича.
Ведется медленная, но уверенная разработка функционала сайта.
Django Core: 0.3.4 / Next.js 1.0 / UPD: 05.06.2023
Функция isinstance() в Python, принадлежность экземпляра к классу
Позволяет проверить принадлежность экземпляра к классу
Синтаксис:
isinstance(object, classinfo)
Параметры:
- object — объект, требующий проверки,
- classinfo — класс, кортеж с классами или рекурсивный кортеж кортежей или с версии Python 3.10 может быть объединением нескольких типов (например int | str ).
Возвращаемое значение:
Описание:
Функция isinstance() вернет True , если проверяемый объект object является экземпляром любого указанного в classinfo класса (классов) или его подкласса (прямого, косвенного или виртуального).
Если объект object не является экземпляром данного типа, то функция всегда возвращает False .
Функцией isinstance() можно проверить класс, кортеж с классами (с Python 3.10 может быть записью, объединяющей нескольких типов, например, int | str ), либо рекурсивный кортеж кортежей. Другие типы последовательностей аргументом classinfo не поддерживаются.
Если аргумент classinfo не является классом, либо кортежем с классами (с Python 3.10 может быть записью, объединяющей нескольких типов, например, int | str ), то возбуждается исключение TypeError .
Изменено в Python 3.10: аргумент classinfo может иметь тип Union и записываться как побитовое или — | .
>>> isinstance(1, int | str) # True >>> isinstance("", int | str) # True
Доступ к пользовательскому типу для объекта union можно получить из types.UnionType и использовать для проверок isinstance() . Невозможно создать экземпляр объекта из типа:
>>> import types >>> isinstance(int | str, types.UnionType) # True >>> types.UnionType() # Traceback (most recent call last): # File "", line 1, in # TypeError: cannot create 'types.UnionType' instances
Примеры проверок принадлежности экземпляра к классу.
Взгляните на следующий код:
>>> a = 3 >>> isinstance(a, object) # True >>> type(a) == object # False >>> issubclass(type(a), object) # True
Молодые программисты часто не понимают что здесь происходит. Давайте разбираться.
Функция type() с одним аргументом object возвращает тип объекта — точный класс, из которого был создан переданный аргумент object . Мы знаем, что все целые числа в Python являются типом int . Это означает, что проверка объекта type(3) == object в точности эквивалентна проверке объекта int == object , что однозначно неверно.
В Python, как это известно — все является объектом, следовательно дочерний класс (в данном случае int ) наследуется от родительского (в данном случае object ) и считается, что такое поведение имеет отношение is a . Отношение is a — это то, что проверяет функция isinstance() .
Существует аналогичная функция issubclass() для проверки того же отношения, только для класса вместо экземпляра этого класса. В большинстве случаев isinstance(x, y) == issubclass(type(x), y) .
Классы всегда имеют одну и ту же ссылку в одной сессии интерпретатора, поэтому можно использовать оператор is вместо оператора == для сравнения. Таким образом, type(3) is int будет истинным.
Изобразим сказанное выше на примере:
class Base: def __init__(self): self.foo='foo' class Sub(Base): def __init__(self): super().__init__() >>> obj = Base() >>> sub_obj = Sub() >>> isinstance(obj, Base) # True >>> isinstance(obj, Sub) # False >>> isinstance(sub_obj, Base) # True >>> isinstance(sub_obj, Sub) # True >>> type(sub_obj) == Base # False >>> type(sub_obj) # >>> type(sub_obj) == Sub # True >>> issubclass(type(sub_obj), Base) # True
Общие приемы проверок.
>>> x = 1 >>> isinstance(x, int) # True >>> x = [1, 2, 3] >>> isinstance(x, list) # True >>> x = (1, 2, 3) >>> isinstance(x, tuple) # True # Проверим, является ли строка 'Hello' одним из типов, описанных в параметре type >>> isinstance('Hello', (float, int, str, list, dict, tuple)) # True # Проверка, на принадлежность к экземпляром myObj class myObj: name = "John" y = myObj() >>> isinstance(y, myObj) # True
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
