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 (khetp_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_allocnếu có thể. Để triển khaitp_alloccho loại của bạn, hãy ưu tiênPyType_GenericAlloc()hoặcPyObject_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
PyObjectban đầ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ọiPyObject_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_allocslot.Khi điền vào vị trí
tp_alloccủ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ặctp_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 trongtp_flags; thay vào đó hãy sử dụngPyObject_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 khetp_freecủ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_Newngoạ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ườngtp_itemsizecủ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_allocslot.Khi điền vào vị trí
tp_alloccủ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 trongtp_flags; thay vào đó hãy sử dụngPyObject_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 khetp_freecủ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 macroPy_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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|