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".
