تخصیص اشیاء روی هیپ¶
-
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، که به یک اشارهگر به این شیء ارزیابی میشود، دسترسی پذیر باشد.
همچنین ببینید
- اشیاء ماژول
برای تخصیص و ایجاد ماژولهای توسعهای.
نامهای مستعار با منسوخسازی نرم¶
اینها نامهای مستعاری برای توابع و ماکروهای موجود هستند. آنها صرفاً برای سازگاری با نسخههای قبلی وجود دارند.
©
حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است.
مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند.
برای اطلاعات بیشتر به
تاریخچه و مجوز مراجعه کنید.
بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است.
لطفاً کمک مالی کنید.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا
اشکالی یافتید؟
ساخته شده با
Sphinx 9.1.0.