Type: примеры (PYTHON)

Работа с функцией type в Python
Раздел: Встроенные функции, Интроспекция
type(object: any): type

Описание функции type

Функция type в Python возвращает тип переданного объекта. Эта функция часто применяется для интроспекции, отладки или для проверки типа данных в условных операторах и функциях, обрабатывающих разные типы входных данных.

У функции type есть две формы вызова:

  1. С одним аргументом: type(object) возвращает тип объекта. Возвращаемое значение является объектом типа, обычно тем же, что возвращает object.__class__.
  2. С тремя аргументами: type(name, bases, dict) создает и возвращает новый объект типа (динамически создает класс).
    • name: строка, которая становится атрибутом __name__ нового класса.
    • bases: кортеж классов, от которых наследуется новый класс, становится атрибутом __bases__.
    • dict: словарь, содержащий пространство имен для тела класса, становится атрибутом __dict__.

Возвращаемое значение при вызове с одним аргументом - объект типа. При вызове с тремя аргументами - новый тип (класс).

Примеры использования

Пример с одним аргументом для определения типа:

print(type(5))
<class 'int'>

Пример с тремя аргументами для создания класса динамически:

MyClass = type('MyClass', (), {'x': 10})
obj = MyClass()
print(obj.x)
print(type(obj))
10
<class '__main__.MyClass'>

Использование для проверки типа:

value = [1, 2, 3]
if type(value) == list:
    print('Это список')
else:
    print('Это не список')
Это список

Похожие функции в Python

isinstance(object, classinfo) проверяет, является ли объект экземпляром класса или кортежа классов. Рекомендуется для проверки типов, так как учитывает наследование.

issubclass(class, classinfo) проверяет, является ли класс подклассом другого класса.

__class__ атрибут объекта, который ссылается на класс объекта. Прямой доступ к атрибуту быстрее, но менее безопасен, чем type().

Функцию type() удобно применять для точного сравнения типов, а isinstance() - для проверки принадлежности к классу или его подклассам.

Альтернативы в других языках

JavaScript: оператор typeof возвращает строку с типом примитива, instanceof проверяет принадлежность к классу.

console.log(typeof 42);
console.log([] instanceof Array);
number
true

PHP: функция gettype() возвращает тип, is_* функции проверяют конкретные типы.

echo gettype(42);
echo is_array([1,2]);
integer
1

Java: метод getClass() возвращает класс объекта, оператор instanceof проверяет тип.

Object obj = new ArrayList<>();
System.out.println(obj.getClass().getName());
System.out.println(obj instanceof List);
java.util.ArrayList
true

C#: оператор typeof получает тип, метод GetType() возвращает тип экземпляра.

Console.WriteLine(typeof(int).Name);
Console.WriteLine(5.GetType().Name);
Int32
Int32

Типичные ошибки

Путаница между type() и isinstance() может приводить к неверным проверкам при наследовании.

class Parent:
    pass
class Child(Parent):
    pass
obj = Child()
print(type(obj) == Parent)
print(isinstance(obj, Parent))
False
True

Неправильное использование трехаргументной формы, когда передаются неверные типы аргументов.

try:
    MyClass = type(123, (), {})
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: type() argument 1 must be str, not int

Изменения в последних версиях

В Python 3.12 были оптимизированы некоторые аспекты создания классов через type(), но публичный API функции не изменился. В Python 3.3 добавлен атрибут __qualname__ для классов, который также отображается при выводе типа.

Расширенные примеры

Использование type для создания класса с методами:

def my_method(self):
    return self.value

MyClass = type('MyClass', (), {'value': 10, 'get_value': my_method})
obj = MyClass()
print(obj.get_value())
10

Сравнение типов для пользовательских классов:

class A: pass
class B(A): pass
a, b = A(), B()
print(type(a) == type(b))
print(isinstance(b, A))
False
True

Динамическое создание классов с наследованием:

BaseClass = type('BaseClass', (), {'attr': 'base'})
DerivedClass = type('DerivedClass', (BaseClass,), {'new_attr': 'derived'})
obj = DerivedClass()
print(obj.attr)
print(obj.new_attr)
base
derived

Использование type в метаклассах:

class Meta(type):
    def __new__(cls, name, bases, dct):
        dct['custom'] = 'added by metaclass'
        return super().__new__(cls, name, bases, dct)

MyClass = Meta('MyClass', (), {})
print(MyClass.custom)
added by metaclass

питон type function comments

En
Type Return object type