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_alloc
sempre que possível. Para implementartp_alloc
para 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_alloc
do tipo.Ao preencher o slot
tp_alloc
de 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_GC
definido emtp_flags
; usePyObject_GC_New
em vez disso.A memória alocada por esta macro deve ser liberada com
PyObject_Free()
(geralmente chamado por meio do slottp_free
do 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_itemsize
de 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_alloc
do tipo.Ao preencher o slot
tp_alloc
de 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_GC
definido emtp_flags
; usePyObject_GC_NewVar
em vez disso.A memória alocada por esta função deve ser liberada com
PyObject_Free()
(geralmente chamado por meio do slottp_free
do 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.