В Python встроенные функции type() и isinstance() используются для получения и проверки типа объекта, например, переменной, и для определения того, относится ли он к определенному типу.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Здесь приводится следующее содержание, а также примеры кода.
- Получение и проверка типа объекта:
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