Как получить тип объекта в Python: обзор методов

Раздел: Типы данных -> Проверка и получение типа

Способы определения типа данных

В Python существует несколько подходов для получения типа переменной. Рассмотрим основные и альтернативные варианты.

Как узнать точный класс объекта?

Функция type() возвращает тип объекта в виде класса. Это самый прямой способ:

x = 42
print(type(x))

Python получить тип (получение типа данных в python)

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

Как получить класс без вызова функции?

У каждого объекта есть атрибут __class__, который хранит ссылку на его класс:

s = 'hello'
print(s.__class__)

Такой подход работает быстрее, но менее явный.

Проблема: при сравнении типа с помощью type(x) == SomeClass не учитывается наследование. Для проверки принадлежности к классу или его потомкам рекомендуется использовать isinstance().

Как проверить, принадлежит ли объект определённому классу или его наследникам?

Функция isinstance() принимает объект и класс (или кортеж классов):

print(isinstance(3.14, (int, float)))
True

Это предпочтительный способ для проверки типа с учётом полиморфизма.

Как отличить обычную функцию от лямбда-выражения?

Модуль types содержит типы для встроенных объектов. Например:

import types
f = lambda x: x
print(isinstance(f, types.LambdaType))
True

Аналогично проверяются types.FunctionType, types.GeneratorType и другие.

Как определить тип пользовательского объекта?

Для экземпляров собственных классов можно использовать type(obj).__name__:

class Car:
    pass

c = Car()
print(type(c).__name__)
Car

Также можно сравнивать с самим классом: type(c) == Car.

Ниже приведены расширенные примеры получения типов данных в разных сценариях.

Динамическое создание класса с помощью type()

Пример
MyClass = type('MyClass', (object,), {'x': 10})
obj = MyClass()
print(type(obj).__name__)
MyClass

Трёхаргументный вызов type() создаёт новый класс.

Проверка на NoneType

Пример
v = None
print(type(v) is type(None))
True

Можно также использовать v is None, но получение типа через type(None) полезно для обобщённых функций.

Получение типа из аннотаций с помощью typing.get_type_hints()

Пример
from typing import get_type_hints

def func(a: int, b: str) -> float:
    return a + float(b)

hints = get_type_hints(func)
print(hints)
{'a': , 'b': , 'return': }

Этот метод позволяет получить типы, указанные в аннотациях функции.

Проверка, является ли объект итератором

Пример
from collections.abc import Iterator

print(isinstance(iter([1,2,3]), Iterator))
True

Абстрактные базовые классы из collections.abc помогают проверять интерфейсы.

Получение типа элемента в разнородном списке

Пример
mixed = [1, 'a', 3.14, None]
for item in mixed:
    print(f'{item!r:8} -> {type(item).__name__}')
1        -> int
'a'      -> str
3.14     -> float
None     -> NoneType

Использование type().__name__ даёт читаемое имя типа.

Получение типа данных в Python - comments

En
Python получить тип (python)