تخصیص اشیاء روی پشته¶
-
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
برای تخصیص و ایجاد ماژولهای افزونه.
نامهای مستعار با منسوخسازی نرم¶
منسوخسازی نرم <Soft deprecated> از نسخهی 3.10.
اینها نامهای مستعاری برای توابع و ماکروهای موجود هستند. آنها صرفاً برای سازگاری با نسخههای قبلی وجود دارند.
نامهای مستعار با منسوخسازی نرم |
تابع |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|