Python

힙에 객체 할당하기

PyObject *_PyObject_New(PyTypeObject *type)
반환값: 새 참조.
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
반환값: 새 참조.
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
반환값: 빌린 참조. …의 일부 안정 ABI.

새로 할당된 객체 op 를 유형 및 초기 참조와 함께 초기화합니다. 초기화된 객체를 반환하며, 객체의 다른 필드는 초기화되지 않습니다. 이름에도 불구하고 이 함수는 객체의 __init__() 메서드(tp_init 슬롯)와 관계가 없습니다. 구체적으로, 이 함수는 객체의 __init__() 메서드를 호출하지 않습니다.

일반적으로 이 함수는 저수준 루틴으로 간주됩니다. 가능한 경우 tp_alloc 을 사용하십시오. 사용자 타입에 대해 tp_alloc 을 구현할 때는 PyType_GenericAlloc() 이나 PyObject_New() 를 사용하는 것이 좋습니다.

참고

이 함수는 초기 PyObject 구조에 해당하는 객체의 메모리만 초기화합니다. 나머지 부분은 0으로 초기화하지 않습니다.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
반환값: 빌린 참조. …의 일부 안정 ABI.

이것은 PyObject_Init()가 수행하는 모든 작업을 수행하고, 가변 크기 객체의 길이 정보도 초기화합니다.

참고

이 함수는 객체 메모리의 일부만 초기화하며, 나머지는 0으로 초기화하지 않습니다.

PyObject_New(TYPE, typeobj)

C 구조체 유형 TYPE 과 파이썬 타입 객체 typeobj (PyTypeObject*)를 사용하여 새로운 파이썬 객체를 할당합니다. PyObject_Malloc() 을 호출하여 메모리를 할당하고 PyObject_Init() 처럼 초기화합니다. 호출자는 해당 객체의 유일한 참조를 소유하게 됩니다(즉, 참조 횟수가 1이 됩니다).

객체용 메모리를 할당하기 위해 이 함수를 직접 호출하는 것을 피하십시오. 대신 해당 타입의 tp_alloc 슬롯을 호출하십시오.

형의 tp_alloc 슬롯을 채울 때, 단순히 이 매크로를 호출하는 사용자 정의 함수보다 PyType_GenericAlloc() 을 사용하는 것이 권장됩니다.

이 매크로는 tp_alloc, tp_new (__new__()), 또는 tp_init (__init__())를 호출하지 않습니다.

이 매크로는 tp_flagsPy_TPFLAGS_HAVE_GC 가 설정된 객체에는 사용할 수 없습니다. 대신 PyObject_GC_New 를 사용하십시오.

이 매크로에 의해 할당된 메모리는 PyObject_Free() 로 해제해야 합니다(보통 객체의 tp_free 슬롯을 통해 호출됩니다).

참고

반환된 메모리가 초기화되기 전에 완전히 0으로 채워졌는지는 보장되지 않습니다.

참고

이 매크로는 주어진 타입의 완전히 초기화된 객체를 생성하지 않습니다. 단지 메모리를 할당하고 tp_init 에 의한 추가 초기화를 위해 준비할 뿐입니다. 완전히 초기화된 객체를 생성하려면 대신 typeobj 를 호출하십시오. 예시:

PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);
PyObject_NewVar(TYPE, typeobj, size)

PyObject_New 와 유사하지만 다음과 같은 차이가 있습니다:

  • TYPE 구조체에 더해 typeobjtp_itemsize 필드에 의해 지정된 크기의 size (Py_ssize_t)만큼의 필드를 위한 충분한 메모리를 할당합니다.

  • 메모리는 PyObject_InitVar() 와 같이 초기화됩니다.

이는 생성 시점에 크기를 결정할 수 있는 튜플과 같은 객체를 구현하는 데 유용합니다. 필드 배열을 동일한 할당 영역에 포함시키면 할당 횟수가 줄어들어 메모리 관리 효율성이 향상됩니다.

객체용 메모리를 할당하기 위해 이 함수를 직접 호출하는 것을 피하십시오. 대신 해당 타입의 tp_alloc 슬롯을 호출하십시오.

형의 tp_alloc 슬롯을 채울 때, 단순히 이 매크로를 호출하는 사용자 정의 함수보다 PyType_GenericAlloc() 을 사용하는 것이 권장됩니다.

이 매크로는 tp_flagsPy_TPFLAGS_HAVE_GC 가 설정된 객체에는 사용할 수 없습니다. 대신 PyObject_GC_NewVar 를 사용하십시오.

이 함수에 의해 할당된 메모리는 PyObject_Free() 로 해제해야 합니다(보통 객체의 tp_free 슬롯을 통해 호출됩니다).

참고

반환된 메모리가 초기화되기 전에 완전히 0으로 채워졌는지는 보장되지 않습니다.

참고

이 매크로는 주어진 타입의 완전히 초기화된 객체를 생성하지 않습니다. 단지 메모리를 할당하고 tp_init 에 의한 추가 초기화를 위해 준비할 뿐입니다. 완전히 초기화된 객체를 생성하려면 대신 typeobj 를 호출하십시오. 예시:

PyObject *list_instance = PyObject_CallNoArgs((PyObject *)&PyList_Type);
PyObject _Py_NoneStruct

파이썬에서 None으로 노출되는 객체. 이 객체에 대한 포인터로 평가되는 Py_None 매크로를 사용해서 액세스해야 합니다.

더 보기

모듈 객체

확장 모듈을 할당하고 만듭니다.

소프트웨어 단계에서 폐지 예정인 에일리어스

이것들은 기존 함수와 매크로에 대한 에일리어스입니다. 오직 하위 호환성을 위해 존재합니다.

소프트웨어 단계에서 폐지 예정인 에일리어스

함수

PyObject_NEW(type, typeobj)

PyObject_New

PyObject_NEW_VAR(type, typeobj, n)

PyObject_NewVar

PyObject_INIT(op, typeobj)

PyObject_Init()

PyObject_INIT_VAR(op, typeobj, n)

PyObject_InitVar()

PyObject_MALLOC(n)

PyObject_Malloc()

PyObject_REALLOC(p, n)

PyObject_Realloc()

PyObject_FREE(p)

PyObject_Free()

PyObject_DEL(p)

PyObject_Free()

PyObject_Del(p)

PyObject_Free()