# type()

Функция `type()` в Python используется для определения типа объекта или создания новых типов (классов).

**Назначение**:

* Определить тип объекта.
* Создать новый тип (класс) динамически.

**Возврат**:

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

**Описание**:

* Может быть вызвана с одним аргументом для определения типа объекта.
* Может быть вызвана с тремя аргументами для создания нового типа (класса):
  1. `name` - строка, содержащая имя нового класса.
  2. `bases` - кортеж базовых классов.
  3. `dict` - словарь, определяющий пространство имен класса.

**Примеры**:

1. Определение типа ***простых объектов***
2. Определение типа ***пользовательских объектов***
3. ***Создание нового класса*** с помощью type()

{% tabs %}
{% tab title="1." %}

```python
print(type(5))  # Выведет: <class 'int'>
print(type("Hello"))  # Выведет: <class 'str'>
print(type([1, 2, 3]))  # Выведет: <class 'list'>
```

{% endtab %}

{% tab title="2." %}

```python
class MyClass:
    pass

obj = MyClass()
print(type(obj))  # Выведет: <class '__main__.MyClass'>
```

{% endtab %}

{% tab title="3." %}

```renpy
NewClass = type('NewClass', (), {'x': 5, 'print_x': lambda self: print(self.x)})
obj = NewClass()
obj.print_x()  # Выведет: 5
```

{% endtab %}
{% endtabs %}

**Использование**:

* Для проверки типа объекта в runtime.
* В метапрограммировании для создания классов динамически.
* Для реализации фабрик классов.
* При отладке для выяснения типа неизвестных объектов.

Функция `type()` является фундаментальной в Python и играет двойную роль. В своем наиболее распространенном использовании она позволяет определить тип объекта, что полезно для отладки и проверки типов во время выполнения программы. В более продвинутом использовании `type()` может создавать новые классы динамически, что делает её мощным инструментом для метапрограммирования.

Важно отметить, что хотя `type()` часто используется для проверки типов, в Python обычно предпочтительнее использовать `isinstance()` для проверки типа объекта, особенно когда речь идет о наследовании. `type()` проверяет точный тип объекта, в то время как `isinstance()` учитывает иерархию наследования.
