تخصیص اشیاء روی پشته

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 است، مقداردهی اولیه می‌کند. بقیه‌ی حافظه را صفر نمی‌کند.

PyVarObject *PyObject_InitVar(PyVarObject *op, PyTypeObject *type, Py_ssize_t size)
مقدار بازگشتی: مرجع قرضی. قسمتی از ABI پایدار.

این تابع همهٔ کارهایی را انجام می‌دهد که PyObject_Init() انجام می‌دهد، و همچنین اطلاعات مربوط به طول را برای یک شیء با اندازهٔ متغیر مقداردهی می‌کند.

توجه

این تابع فقط بخشی از حافظه‌ی شیء را مقداردهی اولیه می‌کند. بقیه‌ی حافظه را صفر نمی‌کند.

PyObject_New(TYPE, typeobj)

یک شیء پایتونی جدید با استفاده از نوع ساختار C یعنی TYPE و شیء نوع پایتون یعنی typeobj (PyTypeObject*) با فراخوانی PyObject_Malloc() برای تخصیص حافظه و مقداردهی اولیه‌ی آن مانند PyObject_Init() تخصیص می‌دهد. فراخوان‌نده، تنها مرجع به شیء را در اختیار خواهد داشت (یعنی شمارنده‌ی ارجاع آن یک خواهد بود).

از فراخوانی مستقیم این تابع برای تخصیص حافظه به یک شیء خودداری کنید؛ به جای آن، درگاه tp_alloc تایپ را فراخوانی کنید.

هنگام پر کردن درگاه tp_alloc یک تایپ، PyType_GenericAlloc() بر یک تابع سفارشی که صرفاً این ماکرو را فراخوانی می‌کند، ترجیح داده می‌شود.

این ماکرو tp_alloc، tp_new (__new__()) یا tp_init (__init__()) را فراخوانی نمی‌کند.

این را نمی‌توان برای اشیایی که Py_TPFLAGS_HAVE_GC در tp_flags آنها تنظیم شده است، استفاده کرد؛ به جای آن از PyObject_GC_New استفاده کنید.

حافظه‌ای که توسط این ماکرو تخصیص داده می‌شود، باید با PyObject_Free() آزاد شود (معمولاً از طریق درگاه tp_free شیء فراخوانی می‌شود).

توجه

حافظه‌ی برگشتی تضمین نمی‌شود که به‌طور کامل صفر شده باشد قبل از این‌که مقداردهی اولیه شود.

توجه

این ماکرو یک شیء کاملاً مقداردهی‌شده از نوع داده‌شده را نمی‌سازد؛ بلکه صرفاً حافظه تخصیص می‌دهد و آن را برای مقداردهی اولیه‌ی بیشتر توسط tp_init آماده می‌کند. برای ساختن یک شیء کاملاً مقداردهی‌شده، به جای آن typeobj را فراخوانی کنید. برای مثال:

PyObject *foo = PyObject_CallNoArgs((PyObject *)&PyFoo_Type);

همچنین ملاحظه نمائید

PyObject_NewVar(TYPE, typeobj, size)

مثل PyObject_New جز:

  • این (ماکرو) به اندازه‌ی کافی برای ساختار TYPE به اضافه‌ی size (Py_ssize_t) فیلد به اندازه‌ای که توسط فیلد tp_itemsize از typeobj مشخص شده، حافظه تخصیص می‌دهد.

  • حافظه، مانند PyObject_InitVar() مقداردهی اولیه می‌شود.

این (روش) برای پیاده‌سازی اشیایی مثل تاپل‌ها مفید است، که می‌توانند اندازه‌ی خود را در زمان ساخت تعیین کنند. جاسازی آرایه‌ی فیلدها در همان تخصیص، تعداد تخصیص‌ها را کاهش می‌دهد و بازدهی مدیریت حافظه را بهبود می‌بخشد.

از فراخوانی مستقیم این تابع برای تخصیص حافظه به یک شیء خودداری کنید؛ به جای آن، درگاه tp_alloc تایپ را فراخوانی کنید.

هنگام پر کردن درگاه tp_alloc یک تایپ، PyType_GenericAlloc() بر یک تابع سفارشی که صرفاً این ماکرو را فراخوانی می‌کند، ترجیح داده می‌شود.

این را نمی‌توان برای اشیایی که Py_TPFLAGS_HAVE_GC در tp_flags آنها تنظیم شده است، استفاده کرد؛ به جای آن از PyObject_GC_NewVar استفاده کنید.

حافظه‌ای که توسط این تابع تخصیص داده می‌شود، باید با PyObject_Free() آزاد شود (معمولاً از طریق درگاه tp_free شیء فراخوانی می‌شود).

توجه

حافظه‌ی برگشتی تضمین نمی‌شود که به‌طور کامل صفر شده باشد قبل از این‌که مقداردهی اولیه شود.

توجه

این ماکرو یک شیء کاملاً مقداردهی‌شده از نوع داده‌شده را نمی‌سازد؛ بلکه صرفاً حافظه تخصیص می‌دهد و آن را برای مقداردهی اولیه‌ی بیشتر توسط tp_init آماده می‌کند. برای ساختن یک شیء کاملاً مقداردهی‌شده، به جای آن typeobj را فراخوانی کنید. برای مثال:

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

همچنین ملاحظه نمائید

PyObject _Py_NoneStruct

شیء‌ای که در پایتون به صورت None قابل مشاهده است این فقط باید با استفاده از ماکرو Py_None، که به یک اشاره‌گر به این شیء ارزیابی می‌شود، دسترسی پذیر باشد.

همچنین ملاحظه نمائید

Module Objects

برای تخصیص و ایجاد ماژول‌های افزونه.

نامهای مستعار با منسوخ‌سازی نرم

اینها نامهای مستعاری برای توابع و ماکروهای موجود هستند. آن‌ها صرفاً برای سازگاری با نسخه‌های قبلی وجود دارند.

نامهای مستعار با منسوخ‌سازی نرم

تابع

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