Класс type() в Python, возвращает тип объекта
Возвращает тип объекта и является собственным метаклассом языка Python
Синтаксис:
type(object) type(name, bases, dict)
Параметры:
- object — объект, тип которого определяется
- name — имя для создаваемого типа
- bases — кортеж с родительскими классами
- dict — словарь, будет являться пространством имён для тела класса
Возвращаемое значение:
- тип объекта, при вызове с одним аргументом,
- объект нового типа при вызове класса с тремя аргументами.
Вызов класса type() с одним аргументом:
Класс type() с одним аргументом object возвращает тип объекта. Возвращаемое значение — это как правило, тот же объект, что и возвращаемый object.__class__ .
Рекомендуется для проверки типа объекта использовать встроенную функцию isinstance() , так как она принимает во внимание подклассы.
Примеры использования класса type() при вызове с одним аргументом.
>>> x = 1 >>> type(x) # >>> x = [1, 2, 3] >>> type(x) # # проверка типа объекта >>> x = 1 >>> isinstance(x, int) # True >>> x = [1, 2, 3] >>> isinstance(x, list) # True
Вызов класса type() с тремя аргументами:
Класс type() с тремя аргументами вернет объект нового типа. Это по сути динамическая форма инструкции class , ее еще называют метакласс.
Другими словами класс type() , вызванный с тремя аргументами на самом деле является метаклассом! Класс type() это метакласс, который Python внутренне использует для создания всех классов.
Все, с чем имеем дело в Python, является объектом. Сюда входят функции и классы целые числа, строки и т.д. Все они объекты. И все они созданы из класса.
# type - это тип всех типов, для # которых не указан явно иной метакласс >>> type(type) # >>> type(object) # >>> type(list) # >>> type(int) # >>> class Bar(object): pass >>> type(Bar) #
В общем type — это класс всех классов в языке Python и является собственным метаклассом. Класс type() нельзя воспроизвести на чистом Python.
Аргумент name является именем класса и становится атрибутом __name__ . bases это кортеж, в котором перечисляются базовые классы, он становится атрибутом __bases__ . dict — это пространство имен, содержащее определения для тела класса, которое копируется в стандартный словарь и становится атрибутом __dict__ .
Понятия класс и тип по сути являются синонимами. Пользовательские типы данных могут быть сконструированы налету, во время исполнения, при помощи вызова type() с тремя аргументами или определены в коде, например при помощи инструкции class .
Важно понимать, что тип, как и другие сущности в Python, тоже является объектом.
Изменено в Python 3.6: подклассы, которые не переопределяют, type.__new__ больше не могут использовать форму с одним аргументом для получения типа объекта.
Примеры создания и изменения классов «на лету» при помощи type() :
Например, следующие два определения создают идентичные объекты.
>>> class Foo(object): . bar = True >>> Foo = type('Foo', (), 'bar':True>)
Класс Foo , созданный через метакласс type() можно использовать как обычный класс:
>>> Foo # >>> f = Foo() >>> f.bar # True # можно наследоваться от него >>> class FooChild(Foo): pass . >>> FooChild # >>> FooChild.bar # bar унаследован от Foo # True
Добавим методы в класс FooChild() . Для этого определим функцию и добавим ее как атрибут.
>>> def echo_bar(self): . print(self.bar) . >>> FooChild = type('FooChild', (Foo,), 'echo_bar': echo_bar>) >>> hasattr(Foo, 'echo_bar') # False >>> hasattr(FooChild, 'echo_bar') # True >>> my_foo = FooChild() >>> my_foo.echo_bar() # True # после динамического создания класса добавим еще один метод >>> def echo_bar_more(self): . print('yet another method') . >>> FooChild.echo_bar_more = echo_bar_more >>> hasattr(FooChild, 'echo_bar_more') # True
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Класс Type() модуля typing в Python
Переменная с аннотацией C может принимать значение типа C . Напротив, переменная, аннотированная классом Type[C] , может принимать значения, которые сами являются классами — в частности, она принимает объект класса C .
a = 3 # Имеет тип 'int' b = int # Имеет тип 'Type[int]' c = type(a) # Также имеет 'Type[int]'
Обратите внимание, что type[C] является ковариантным:
class User: . class BasicUser(User): . class ProUser(User): . class TeamUser(User): . # Принимает User, BasicUser, ProUser, TeamUser, . def make_new_user(user_class: type[User]) -> User: # . return user_class()
Тот факт, что type[C] является ковариантным, подразумевает, что все подклассы C должны реализовывать ту же сигнатуру конструктора и сигнатуры методов класса, что и C . Средство проверки типизации должно отмечать нарушения этого, но также должно разрешать вызовы конструкторов в подклассах, которые соответствуют вызовам конструктора в указанном базовом классе. То, как для инструментов проверки типов требуется обработать этот конкретный случай, может измениться в будущих версиях.
Единственными допустимыми параметрами для type являются классы, Any , типы из collections.abc и объединения Union любого из этих типов.
def new_non_team_user(user_class: type[Union[BasicUser, ProUser]]): .
Type[Any] эквивалентен Type , который, в свою очередь, эквивалентен type , который является корнем иерархии метаклассов Python.
Не рекомендуется с Python 3.9: встроенный класс type() теперь поддерживает синтаксис аннотаций [] .
Дополнительно смотрите встроенный в Python «Тип псевдонима».
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Аннотация Any модуля typing
- Аннотации Never и NoReturn модуля typing
- Тип аннотации TypeAlias модуля typing
- Аннотация LiteralString модуля typing
- Аннотация Self модуля typing
- Аннотации Required и NotRequired модуля typing
- Тип аннотации Union модуля typing
- Тип аннотации Optional модуля typing
- Тип аннотации Tuple() модуля typing
- Тип аннотации Callable() модуля typing
- Тип аннотации Concatenate модуля typing
- Класс ParamSpec модуля typing
- Тип аннотации TypeGuard модуля typing
- Класс Type() модуля typing
- Тип аннотации Literal модуля typing
- Тип аннотации ClassVar модуля typing
- Тип аннотации Final() модуля typing
- Тип аннотации Annotated модуля typing
- Тип аннотации Generic модуля typing
- Тип аннотации TypeVar модуля typing
- Аннотация TypeVarTuple модуля typing
- Тип аннотации Unpack модуля typing
- Тип аннотации AnyStr модуля typing
- Тип аннотации Protocol() модуля typing
- Декоратор @runtime_checkable модуля typing
- Тип аннотации NamedTuple модуля typing
- Класс NewType модуля typing
- Тип аннотации TypedDict() модуля typing
- Типы аннотаций коллекций модуля typing
- Аннотация абстрактных базовых классов
- Функции и декораторы модуля typing
- Помощники самоанализа модуля typing
- ParamSpecArgs и ParamSpecKwargs модуля typing
- Класс TypeAliasType модуля typing
type (тип)
Один аргумент:
obj — Объект, тип которого требуется определить.
Три аргумента:
name — Имя для создаваемого типа (становится атрибутом ‘__name__’);
bases — Кортеж с родительскими классами (становится атрибутом ‘__bases__’);
dict — Словарь, который будет являться пространством имён для тела класса (становится атрибутом ‘__dict__’).
Типы данных определяют способности своих объектов (аспекты поведения) и возможные значения для них.
Способности — это операции, которые поддерживает объект (например, может ли объект быть умножен на другой объект) и свойства объекта (например, есть у объекта длина, является ли он изменяемым).
На заметку
Важно понимать, что тип, как и другие сущности в Python, тоже является объектом.
type(object) #
type(type) #
type(int) #
type(57) #
class MyClass(object): pass
type(MyClass) #
type(MyClass()) #
isinstance(object, object) # True
isinstance(type, object) # True
- type — это тип всех типов (для, которых не указан явно иной метакласс);
- тип object — это база для остальных типов.
Пользовательские типы данных могут быть сконструированы налету (во время исполнения) при помощи вызова type() (с тремя аргументами) или определены в коде, например при помощи инструкции class.
Понятия класс и тип по сути являются синонимами, начиная с +py2.3 (см. описание в object).
Вызов type
1. Вызов type() с одним аргументом позволяет получить тип указанного [аргументом] объекта (обычно возвращается тот же тип, что хранится в атрибуте объекта __class__). Однако для проверки соответствия типа объекта какому-либо типу (или нескольким) рекомендуется воспользоваться функцией isinstance(), ввиду того, что она принимает во внимание иерархию типов.
my_var = 1
type(my_var) #
2. +py2.2 Вызов type() с тремя аргументами позволяет сконструировать новый объект типа во время исполнения.
# Определение типа при помощи инструкции class
class MyType: # Для Python 2 - MyType(object)
a = 1
# То же определение типа, но во время исполнения при помощи type()
MyType = type('MyType', (object,), )
Функция type() в Python
Python имеет множество встроенных функций. Функция type() используется для получения типа объекта.
type(object) type(name, bases, dict)
- Когда один аргумент передается функции type(), она возвращает тип объекта. Его значение такое же, как у переменной экземпляра object .__ class__.
- Когда передаются три аргумента, он возвращает объект нового типа. Он используется для динамического создания класса «на лету».
- Строка «name» становится именем класса. То же, что и атрибут __name__ класса.
- Кортеж «base» определяет базовые классы. То же, что и атрибут __bases__ класса.
- Словарь «dict» используется для создания тела класса. То же, что и атрибут __dict__ класса.
Примеры
Давайте рассмотрим несколько примеров использования функции type().
Проверка типа объекта
x = 10 print(type(x)) s = 'abc' print(type(s)) from collections import OrderedDict od = OrderedDict() print(type(od)) class Data: pass d = Data() print(type(d))
Обратите внимание, что функция type() возвращает тип объекта с именем модуля. Поскольку в нашем скрипте Python нет модуля, он становится __main__.
Создание динамических классов
Допустим, у нас есть следующие классы.
class Data: """Data Class""" d_id = 10 class SubData(Data): """SubData Class""" sd_id = 20
Напечатаем некоторые свойства этих классов.
print(Data.__class__) print(Data.__bases__) print(Data.__dict__) print(Data.__doc__) print(SubData.__class__) print(SubData.__bases__) print(SubData.__dict__) print(SubData.__doc__)
(,) , '__weakref__': > Data Class (,) SubData Class
Мы можем создавать похожие классы с помощью функции type().
Data1 = type('Data1', (object,), ) SubData1 = type('SubData1', (Data1,), ) print(Data1.__class__) print(Data1.__bases__) print(Data1.__dict__) print(Data1.__doc__) print(SubData1.__class__) print(SubData1.__bases__) print(SubData1.__dict__) print(SubData1.__doc__)
(,) , '__weakref__': > Data1 Class (,) SubData1 Class
Обратите внимание, что мы не можем создавать функции в динамическом классе с помощью функции type().
Использование функции type()
Python – это язык с динамической типизацией. Итак, если мы хотим узнать тип аргументов, мы можем использовать функцию type(). Если вы хотите убедиться, что ваша функция работает только с определенными типами объектов, используйте функцию isinstance().
Допустим, мы хотим создать функцию для вычисления чего-либо по двум целым числам. Мы можем реализовать это следующим образом.
def calculate(x, y, op='sum'): if not(isinstance(x, int) and isinstance(y, int)): print(f'Invalid Types of Arguments - x:, y:') raise TypeError('Incompatible types of arguments, must be integers') if op == 'difference': return x - y if op == 'multiply': return x * y # default is sum return x + y
Функция isinstance() используется для проверки типа входного аргумента. Функция type() используется для вывода типа параметров в случае сбоя проверки.