# Objetos Tipos

`PyTypeObject`

  La estructura C de los objetos utilizados para describir los tipos incorporados.

PyObject* `PyType_Type`

  Este es el objeto tipo para objetos tipo; es el mismo objeto que `type` en la capa Python.

int `PyType_Check`(PyObject *o)

  Retorna verdadero si el objeto o es un objeto tipo, incluidas las instancias de tipos derivados del objeto tipo estándar. Retorna falso en todos los demás casos.

int `PyType_CheckExact`(PyObject *o)

  Retorna verdadero si el objeto o es un objeto tipo, pero no un subtipo del objeto tipo estándar. Retorna falso en todos los demás casos.

unsigned int `PyType_ClearCache`()

  Borra la caché de búsqueda interna. Retorna la etiqueta (tag) de la versión actual.

unsigned long `PyType_GetFlags`(PyTypeObject* type)

  Retorna el miembro `tp_flags` de type. Esta función está destinada principalmente para su uso con Py_LIMITED_API; se garantiza que los bits de bandera (flag) individuales serán estables en las versiones de Python, pero el acceso a `tp_flags` en sí mismo no forma parte de la API limitada.

  Nuevo en la versión 3.2.

  Distinto en la versión 3.4: El tipo de retorno es ahora `unsigned long` en vez de `long`.

void `PyType_Modified`(PyTypeObject *type)

  Invalida la memoria caché de búsqueda interna para el tipo y todos sus subtipos. Esta función debe llamarse después de cualquier modificación manual de los atributos o clases base del tipo.

int `PyType_HasFeature`(PyTypeObject *o, int feature)

  Retorna verdadero si el tipo objeto o establece la característica feature. Las características de tipo se denotan con banderas de un solo bit.

int `PyType_IS_GC`(PyTypeObject *o)

  Retorna verdadero si el objeto tipo incluye soporte para el detector de ciclo; Esto prueba el indicador de tipo `Py_TPFLAGS_HAVE_GC`.

int `PyType_IsSubtype`(PyTypeObject *a, PyTypeObject *b)

  Retorna verdadero si a es un subtipo de b.

  Esta función solo busca subtipos reales, lo que significa que `__subclasscheck__()` no se llama en b. Llama `PyObject_IsSubclass()` para hacer el mismo chequeo que `issubclass()` haría.

PyObject* `PyType_GenericAlloc`(PyTypeObject *type, Py_ssize_t nitems)
  Return value: New reference.

  Controlador genérico para la ranura `tp_alloc` de un objeto tipo. Usa el mecanismo de asignación de memoria predeterminado de Python para asignar una nueva instancia e inicializar todo su contenido a `NULL`.

PyObject* `PyType_GenericNew`(PyTypeObject *type, PyObject *args, PyObject *kwds)
  Return value: New reference.

  Controlador genérico para la ranura `tp_new` de un objeto tipo. Crea una nueva instancia utilizando la ranura del tipo `tp_alloc`.

int `PyType_Ready`(PyTypeObject *type)

  Finalizar un objeto tipo. Se debe llamar a todos los objetos tipo para finalizar su inicialización. Esta función es responsable de agregar ranuras heredadas de la clase base de un tipo. Retorna `0` en caso de éxito o retorna `-1` y establece una excepción en caso de error.

void* `PyType_GetSlot`(PyTypeObject *type, int slot)

  Retorna el puntero de función almacenado en la ranura dada. Si el resultado es `NULL`, esto indica que la ranura es `NULL` o que la función se llamó con parámetros no válidos. Las personas que llaman suelen convertir el puntero de resultado en el tipo de función apropiado.

  Consulte `PyType_Slot.slot` para conocer los posibles valores del argumento slot.

  Se lanza una excepción si type no es un tipo montículo (heap).

  Nuevo en la versión 3.4.

## Crear tipos asignados en montículo (heap)

Las siguientes funciones y estructuras se utilizan para crear heap types.

PyObject* `PyType_FromSpecWithBases`(PyType_Spec *spec, PyObject *bases)
  Return value: New reference.

  Crea y retorna un objeto montículo (heap) a partir de spec (`Py_TPFLAGS_HEAPTYPE`).

  Si bases es una tupla, el tipo montículo (heap) creado contiene todos los tipos contenidos en él como tipos básicos.

  If bases is `NULL`, the Py_tp_bases slot is used instead. If that also is `NULL`, the Py_tp_base slot is used instead. If that also is `NULL`, the new type derives from `object`.

  Esta función llama `PyType_Ready()` en el tipo nuevo.

  Nuevo en la versión 3.3.

PyObject* `PyType_FromSpec`(PyType_Spec *spec)
  Return value: New reference.

  Equivalente a `PyType_FromSpecWithBases(spec, NULL)`.

`PyType_Spec`

  Estructura que define el comportamiento de un tipo.

  const char* `PyType_Spec.name`

    Nombre del tipo, utilizado para establecer `PyTypeObject.tp_name`.

  int `PyType_Spec.basicsize`
  int `PyType_Spec.itemsize`

    Tamaño de la instancia en bytes, utilizado para establecer `PyTypeObject.tp_basicsize` y `PyTypeObject.tp_itemsize`.

  int `PyType_Spec.flags`

    Banderas (flags) del tipo, que se usan para establecer `PyTypeObject.tp_flags`.

    Si el indicador `Py_TPFLAGS_HEAPTYPE` no está establecido, `PyType_FromSpecWithBases()` lo establece automáticamente.

  PyType_Slot *`PyType_Spec.slots`

    Arreglo de estructuras `PyType_Slot`. Terminado por el valor de ranura especial `{0, NULL}`.

`PyType_Slot`

  Estructura que define la funcionalidad opcional de un tipo, que contiene una ranura ID y un puntero de valor.

  int `PyType_Slot.slot`

    Una ranura ID.

    Las ranuras IDs se nombran como los nombres de campo de las estructuras `PyTypeObject`, `PyNumberMethods`, `PySequenceMethods`, `PyMappingMethods` y `PyAsyncMethods` con un prefijo `Py_` agregado. Por ejemplo, use:

    - `Py_tp_dealloc` para establecer `PyTypeObject.tp_dealloc`

    - `Py_nb_add` para establecer `PyNumberMethods.nb_add`

    - `Py_sq_length` para establecer `PySequenceMethods.sq_length`

    Los siguientes campos no se pueden establecer usando `PyType_Spec` y `PyType_Slot`:

    - `tp_dict`

    - `tp_mro`

    - `tp_cache`

    - `tp_subclasses`

    - `tp_weaklist`

    - `tp_print`

    - `tp_weaklistoffset`

    - `tp_dictoffset`

    - `bf_getbuffer`

    - `bf_releasebuffer`

    Setting `Py_tp_bases` or `Py_tp_base` may be problematic on some platforms. To avoid issues, use the bases argument of `PyType_FromSpecWithBases()` instead.

  void *`PyType_Slot.pfunc`

    El valor deseado de la ranura. En la mayoría de los casos, este es un puntero a una función.

    Puede no ser `NULL`.