Cấp phát các đối tượng trên Heap

PyObject *_PyObject_New(PyTypeObject *type)
Giá trị trả về: Tham chiếu mới.
PyVarObject *_PyObject_NewVar(PyTypeObject *type, Py_ssize_t size)
Giá trị trả về: Tham chiếu mới.
PyObject *PyObject_Init(PyObject *op, PyTypeObject *type)
Giá trị trả về: Tham chiếu mượn. Một phần của ABI ổn định.

Khởi tạo một đối tượng mới được phân bổ op với loại và tham chiếu ban đầu của nó. Trả về đối tượng được khởi tạo. Các trường khác của đối tượng không được khởi tạo. Mặc dù có tên như vậy nhưng hàm này không liên quan đến phương thức __init__() của đối tượng (khe tp_init). Cụ thể, hàm này not gọi phương thức __init__() của đối tượng.

Nói chung, hãy coi chức năng này là một thủ tục cấp thấp. Sử dụng tp_alloc nếu có thể. Để triển khai tp_alloc cho loại của bạn, hãy ưu tiên PyType_GenericAlloc() hoặc PyObject_New().

Ghi chú

Hàm này chỉ khởi tạo bộ nhớ của đối tượng tương ứng với cấu trúc PyObject ban đầu. Nó không bằng không phần còn lại.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
Giá trị trả về: Tham chiếu mượn. Một phần của ABI ổn định.

Điều này thực hiện mọi thứ mà PyObject_Init() thực hiện và cũng khởi tạo thông tin về độ dài cho một đối tượng có kích thước thay đổi.

Ghi chú

Hàm này chỉ khởi tạo một số bộ nhớ của đối tượng. Nó không bằng không phần còn lại.

PyObject_New(TYPE, typeobj)

Phân bổ một đối tượng Python mới bằng cách sử dụng kiểu cấu trúc C TYPE và đối tượng kiểu Python typeobj (PyTypeObject*) bằng cách gọi PyObject_Malloc() để phân bổ bộ nhớ và khởi tạo nó như PyObject_Init(). Người gọi sẽ sở hữu tham chiếu duy nhất đến đối tượng (tức là số tham chiếu của nó sẽ là một).

Tránh gọi trực tiếp điều này để phân bổ bộ nhớ cho một đối tượng; thay vào đó hãy gọi loại tp_alloc slot.

Khi điền vào vị trí tp_alloc của một loại, PyType_GenericAlloc() được ưu tiên hơn chức năng tùy chỉnh chỉ gọi macro này.

Macro này không gọi tp_alloc, tp_new (__new__()) hoặc tp_init (__init__()).

Điều này không thể được sử dụng cho các đối tượng có Py_TPFLAGS_HAVE_GC được đặt trong tp_flags; thay vào đó hãy sử dụng PyObject_GC_New.

Bộ nhớ được cấp phát bởi macro này phải được giải phóng bằng PyObject_Free() (thường được gọi thông qua khe tp_free của đối tượng).

Ghi chú

Bộ nhớ được trả về không được đảm bảo là đã hoàn toàn bằng 0 trước khi nó được khởi tạo.

Ghi chú

Macro này không xây dựng một đối tượng được khởi tạo đầy đủ thuộc loại đã cho; nó chỉ phân bổ bộ nhớ và chuẩn bị cho việc khởi tạo thêm bằng tp_init. Để xây dựng một đối tượng được khởi tạo đầy đủ, thay vào đó hãy gọi typeobj. Ví dụ:

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

Giống như PyObject_New ngoại trừ:

  • Nó phân bổ đủ bộ nhớ cho cấu trúc TYPE cộng với các trường size (Py_ssize_t) có kích thước được cung cấp bởi trường tp_itemsize của typeobj.

  • Bộ nhớ được khởi tạo như PyObject_InitVar().

Điều này rất hữu ích cho việc triển khai các đối tượng như bộ dữ liệu, có thể xác định kích thước của chúng tại thời điểm xây dựng. Việc nhúng mảng trường vào cùng một phân bổ sẽ làm giảm số lượng phân bổ, cải thiện hiệu quả quản lý bộ nhớ.

Tránh gọi trực tiếp điều này để phân bổ bộ nhớ cho một đối tượng; thay vào đó hãy gọi loại tp_alloc slot.

Khi điền vào vị trí tp_alloc của một loại, PyType_GenericAlloc() được ưu tiên hơn chức năng tùy chỉnh chỉ gọi macro này.

Điều này không thể được sử dụng cho các đối tượng có Py_TPFLAGS_HAVE_GC được đặt trong tp_flags; thay vào đó hãy sử dụng PyObject_GC_NewVar.

Bộ nhớ được cấp phát bởi chức năng này phải được giải phóng bằng PyObject_Free() (thường được gọi thông qua khe tp_free của đối tượng).

Ghi chú

Bộ nhớ được trả về không được đảm bảo là đã hoàn toàn bằng 0 trước khi nó được khởi tạo.

Ghi chú

Macro này không xây dựng một đối tượng được khởi tạo đầy đủ thuộc loại đã cho; nó chỉ phân bổ bộ nhớ và chuẩn bị cho việc khởi tạo thêm bằng tp_init. Để xây dựng một đối tượng được khởi tạo đầy đủ, thay vào đó hãy gọi typeobj. Ví dụ:

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

Đối tượng hiển thị trong Python dưới dạng None. Điều này chỉ nên được truy cập bằng macro Py_None, macro này đánh giá một con trỏ tới đối tượng này.

Xem thêm

Đối tượng mô-đun

Để phân bổ và tạo các mô-đun mở rộng.

Bí danh không được dùng nữa

Đây là các bí danh soft deprecated cho các hàm và macro hiện có. Chúng tồn tại chỉ để tương thích ngược.

Bí danh không được dùng nữa

Chức năng

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()