Type: примеры (PYTHON)
type(object: any): typeОписание функции type
Функция type в Python возвращает тип переданного объекта. Эта функция часто применяется для интроспекции, отладки или для проверки типа данных в условных операторах и функциях, обрабатывающих разные типы входных данных.
У функции type есть две формы вызова:
- С одним аргументом:
type(object)возвращает тип объекта. Возвращаемое значение является объектом типа, обычно тем же, что возвращаетobject.__class__. - С тремя аргументами:
type(name, bases, dict)создает и возвращает новый объект типа (динамически создает класс).- name: строка, которая становится атрибутом
__name__нового класса. - bases: кортеж классов, от которых наследуется новый класс, становится атрибутом
__bases__. - dict: словарь, содержащий пространство имен для тела класса, становится атрибутом
__dict__.
- name: строка, которая становится атрибутом
Возвращаемое значение при вызове с одним аргументом - объект типа. При вызове с тремя аргументами - новый тип (класс).
Примеры использования
Пример с одним аргументом для определения типа:
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