Как получить тип объекта в 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__ даёт читаемое имя типа.