إنشاء مثيل فئة بيثون، أعلن في بيثون، مع C API
-
18-09-2019 - |
سؤال
أريد إنشاء مثيل لفئة بيثون المحددة في __main__
نطاق مع CPI C.
على سبيل المثال، يسمى الفصل MyClass
ويتم تعريفه على النحو التالي:
class MyClass:
def __init__(self):
pass
نوع الطبقة يعيش تحت __main__
مجال.
ضمن تطبيق C، أريد إنشاء مثيل من هذه الفئة. هذا كان يمكن أن يكون ببساطة ممكن مع PyInstance_New
كما يتطلب اسم الفصل. ومع ذلك، هذه الوظيفة غير متوفرة في Python3.
يتم تقدير أي مساعدة أو اقتراحات للبدائل.
شكرا، بول
المحلول
أعتقد أن أبسط نهج هو:
/* get sys.modules dict */
PyObject* sys_mod_dict = PyImport_GetModuleDict();
/* get the __main__ module object */
PyObject* main_mod = PyMapping_GetItemString(sys_mod_dict, "__main__");
/* call the class inside the __main__ module */
PyObject* instance = PyObject_CallMethod(main_mod, "MyClass", "");
بالإضافة إلى التحقق من الخطأ بالطبع. تحتاج فقط decref instance
عندما تنتهي مع ذلك، فإن الاثنين الآخرين مراجع مستعارة.
لا تنتمي إلى StackOverflow