type(), isinstance() для получения и определения типа в Python

Бизнес

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

Здесь приводится следующее содержание, а также примеры кода.

  • Получение и проверка типа объекта:type()
  • Определение типа объекта:type(),isinstance()
    • Определение типа с помощью type()
    • Определение типа с помощью функции isinstance()
    • Разница между type() и isinstance()

Вместо определения типа объекта можно использовать обработку исключений или встроенную функцию hasattr(), чтобы определить, имеет ли объект правильные методы и атрибуты.

Получение и проверка типа объекта: type()

type(object) — это функция, которая возвращает тип объекта, переданного в качестве аргумента. Ее можно использовать для определения типа объекта.

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

Возвращаемое значение type() — это объект типа, такой как str или int.

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

Определение типа объекта: type(), isinstance()

Для определения типа используйте type() или isinstance().

Определение типа с помощью type()

Сравнивая возвращаемое значение type() с произвольным типом, можно определить, является ли объект любым типом.

print(type('string') is str)
# True

print(type('string') is int)
# False
def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

Если вы хотите определить, является ли он одним из нескольких типов, используйте оператор in и кортеж или список из нескольких типов.

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

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

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Определение типа с помощью функции isinstance()

isinstance(object, class) — это функция, которая возвращает true, если объект первого аргумента является экземпляром типа или подкласса второго аргумента.

Второй аргумент может быть кортежем типов. Если это экземпляр любого из типов, возвращается true.

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

Функция, аналогичная примеру определения типа с помощью type(), может быть записана следующим образом

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Разница между type() и isinstance()

Разница между type() и isinstance() заключается в том, что isinstance() возвращает true для экземпляров подклассов, которые наследуют класс, указанный в качестве второго аргумента.

Например, определены следующие суперкласс (базовый класс) и подкласс (производный класс)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

Определение типа с помощью type() возвращает true только при совпадении типов, а isinstance() возвращает true даже для суперклассов.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Даже для стандартных типов, например, булевого типа bool (true,false), необходимо соблюдать осторожность. bool является подклассом целочисленного типа, поэтому isinstance() возвращает true даже для int, от которого он унаследован.

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

Если вы хотите определить точный тип, используйте type(); если вы хотите определить тип с учетом наследования, используйте isinstance().

Встроенная функция issubclass() также предназначена для определения того, является ли класс подклассом другого класса.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False
Copied title and URL