У 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(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