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

Бізнес

У Python вбудовані функції type() і isinstance() використовуються для отримання та перевірки типу об’єкта, наприклад змінної, і визначення того, чи є він певного типу.

Тут пояснюється наступний вміст разом із зразком коду.

  • Отримати та перевірити тип об’єкта: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
Copied title and URL