Objetos de tipo
***************

PyTypeObject

   A estrutura C dos objetos usados para descrever tipos embutidos.

PyObject* PyType_Type

   Este é o objeto de tipo para objetos tipo; é o mesmo objeto que
   "type" na camada Python.

int PyType_Check(PyObject *o)

   Return true if the object *o* is a type object, including instances
   of types derived from the standard type object.  Return false in
   all other cases.

int PyType_CheckExact(PyObject *o)

   Return true if the object *o* is a type object, but not a subtype
   of the standard type object.  Return false in all other cases.

unsigned int PyType_ClearCache()

   Limpa o cache de pesquisa interno. Retorna a marcação de versão
   atual.

unsigned long PyType_GetFlags(PyTypeObject* type)

   Retorna o membro "tp_flags" de *type*. Esta função deve ser usada
   principalmente com *Py_LIMITED_API*; os bits sinalizadores
   individuais têm garantia de estabilidade em todas as versões do
   Python, mas o acesso a "tp_flags" não faz parte da API limitada.

   Novo na versão 3.2.

   Alterado na versão 3.4: O tipo de retorno é agora um "unsigned
   long" em vez de um "long".

void PyType_Modified(PyTypeObject *type)

   Invalida o cache de pesquisa interna para o tipo e todos os seus
   subtipos. Esta função deve ser chamada após qualquer modificação
   manual dos atributos ou classes bases do tipo.

int PyType_HasFeature(PyTypeObject *o, int feature)

   Return true if the type object *o* sets the feature *feature*.
   Type features are denoted by single bit flags.

int PyType_IS_GC(PyTypeObject *o)

   Retorna verdadeiro se o objeto tipo incluir suporte para o detector
   de ciclo; isso testa o sinalizador de tipo "Py_TPFLAGS_HAVE_GC".

int PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)

   Retorna verdadeiro se *a* for um subtipo de *b*.

   Esta função só verifica pelos subtipos, o que significa que
   "__subclasscheck__()" não é chamado em *b*.  Chame
   "PyObject_IsSubclass()" para fazer a mesma verificação que
   "issubclass()" faria.

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

   Manipulador genérico para o slot "tp_alloc" de um objeto tipo. Use
   o mecanismo de alocação de memória padrão do Python para alocar uma
   nova instância e inicializar todo o seu conteúdo para "NULL".

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

   Manipulador genérico para o slot "tp_new" de um objeto tipo. Cria
   uma nova instância usando o slot "tp_alloc" do tipo.

int PyType_Ready(PyTypeObject *type)

   Finaliza um objeto tipo. Isso deve ser chamado em todos os objetos
   tipo para finalizar sua inicialização. Esta função é responsável
   por adicionar slots herdados da classe base de um tipo. Retorna "0"
   em caso de sucesso, ou retorna "-1" e define uma exceção em caso de
   erro.

void* PyType_GetSlot(PyTypeObject *type, int slot)

   Retorna o ponteiro de função armazenado no slot fornecido. Se o
   resultado for "NULL", isso indica que o slot é "NULL" ou que a
   função foi chamada com parâmetros inválidos. Os chamadores
   normalmente lançarão o ponteiro do resultado no tipo de função
   apropriado.

   Veja "PyType_Slot.slot" por possíveis valores do argumento *slot*.

   Uma exceção é levantada se *type* não é um tipo heap.

   Novo na versão 3.4.


Creating Heap-Allocated Types
=============================

The following functions and structs are used to create heap types.

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

   Creates and returns a heap type object from the *spec*
   ("Py_TPFLAGS_HEAPTYPE").

   If *bases* is a tuple, the created heap type contains all types
   contained in it as base types.

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

   This function calls "PyType_Ready()" on the new type.

   Novo na versão 3.3.

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

   Equivalent to "PyType_FromSpecWithBases(spec, NULL)".

PyType_Spec

   Structure defining a type's behavior.

   const char* PyType_Spec.name

      Name of the type, used to set "PyTypeObject.tp_name".

   int PyType_Spec.basicsize

   int PyType_Spec.itemsize

      Size of the instance in bytes, used to set
      "PyTypeObject.tp_basicsize" and "PyTypeObject.tp_itemsize".

   int PyType_Spec.flags

      Type flags, used to set "PyTypeObject.tp_flags".

      If the "Py_TPFLAGS_HEAPTYPE" flag is not set,
      "PyType_FromSpecWithBases()" sets it automatically.

   PyType_Slot *PyType_Spec.slots

      Array of "PyType_Slot" structures. Terminated by the special
      slot value "{0, NULL}".

PyType_Slot

   Structure defining optional functionality of a type, containing a
   slot ID and a value pointer.

   int PyType_Slot.slot

      A slot ID.

      Slot IDs are named like the field names of the structures
      "PyTypeObject", "PyNumberMethods", "PySequenceMethods",
      "PyMappingMethods" and "PyAsyncMethods" with an added "Py_"
      prefix. For example, use:

      * "Py_tp_dealloc" to set "PyTypeObject.tp_dealloc"

      * "Py_nb_add" to set "PyNumberMethods.nb_add"

      * "Py_sq_length" to set "PySequenceMethods.sq_length"

      The following fields cannot be set using "PyType_Spec" and
      "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

      The desired value of the slot. In most cases, this is a pointer
      to a function.

      May not be "NULL".
