Alocando objetos na heap¶
-
PyObject *_PyObject_New(PyTypeObject *type)¶
- Retorna valor: Nova referência.
-
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)¶
- Retorna valor: Nova referência.
-
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)¶
- Retorna valor: Referência emprestada. Parte da ABI Estável.
Inicializa um objeto op recém-alocado com seu tipo e referência inicial. Retorna o objeto inicializado. Outros campos do objeto não são inicializados. Apesar do nome, esta função não tem relação com o método
__init__()do objeto (slottp_init). Especificamente, esta função não chama o método__init__()do objeto.Em geral, considere esta função como uma rotina de baixo nível. Use
tp_allocsempre que possível. Para implementartp_allocpara o seu tipo, prefiraPyType_GenericAlloc()ouPyObject_New().Nota
Esta função inicializa apenas a memória do objeto correspondente à estrutura inicial
PyObject. Não zera o restante.
-
PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)¶
- Retorna valor: Referência emprestada. Parte da ABI Estável.
Isto faz tudo que o
PyObject_Init()faz e também inicializa a informação de comprimento para um objeto de tamanho variável.Nota
Esta função inicializa apenas parte da memória do objeto. Não zera o restante.
-
PyObject_New(TYPE, typeobj)¶
Aloca um novo objeto Python usando o tipo de estrutura C TYPE e o objeto de tipo Python typeobj (
PyTypeObject*) chamandoPyObject_Malloc()para alocar memória e inicializando-o comoPyObject_Init(). O chamador possuirá a única referência ao objeto (ou seja, sua contagem de referências será um).Evite chamar isso diretamente para alocar memória para um objeto; em vez disso, chame o slot
tp_allocdo tipo.Ao preencher o slot
tp_allocde um tipo,PyType_GenericAlloc()é preferível a uma função personalizada que simplesmente chama esta macro.Esta macro não chama
tp_alloc,tp_new(__new__()) outp_init(__init__()).Isso não pode ser usado para objetos com
Py_TPFLAGS_HAVE_GCdefinido emtp_flags; usePyObject_GC_Newem vez disso.A memória alocada por esta macro deve ser liberada com
PyObject_Free()(geralmente chamado por meio do slottp_freedo objeto).Nota
Não há garantia de que a memória retornada tenha sido completamente zerada antes de ser inicializada.
Nota
Esta macro não constrói um objeto totalmente inicializado do tipo fornecido; ela apenas aloca memória e a prepara para inicialização posterior por
tp_init. Para construir um objeto totalmente inicializado, chame typeobj. Por exemplo:PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
-
PyObject_NewVar(TYPE, typeobj, size)¶
Como
PyObject_New, exceto que:Ela aloca memória suficiente para a estrutura TYPE mais os size (
Py_ssize_t) campos do tamanho fornecido pelo campotp_itemsizede typeobj.A memória é inicializada como
PyObject_InitVar().
Isso é útil para implementar objetos como tuplas, que conseguem determinar seu tamanho em tempo de construção. Incorporar o vetor de campos na mesma alocação diminui o número de alocações, melhorando a eficiência do gerenciamento de memória.
Evite chamar isso diretamente para alocar memória para um objeto; em vez disso, chame o slot
tp_allocdo tipo.Ao preencher o slot
tp_allocde um tipo,PyType_GenericAlloc()é preferível a uma função personalizada que simplesmente chama esta macro.Isso não pode ser usado para objetos com
Py_TPFLAGS_HAVE_GCdefinido emtp_flags; usePyObject_GC_NewVarem vez disso.A memória alocada por esta função deve ser liberada com
PyObject_Free()(geralmente chamado por meio do slottp_freedo objeto).Nota
Não há garantia de que a memória retornada tenha sido completamente zerada antes de ser inicializada.
Nota
Esta macro não constrói um objeto totalmente inicializado do tipo fornecido; ela apenas aloca memória e a prepara para inicialização posterior por
tp_init. Para construir um objeto totalmente inicializado, chame typeobj. Por exemplo:PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
-
void PyObject_Del(void *op)¶
Mesmo que
PyObject_Free().
-
PyObject _Py_NoneStruct¶
Objeto o qual é visível no Python como
None. Isto só deve ser acessado usando a macroPy_None, o qual avalia como um ponteiro para este objeto.
Ver também
- Objetos do Módulo
Para alocar e criar módulos de extensão.