إنشاء مثيل فئة بيثون، أعلن في بيثون، مع C API

StackOverflow https://stackoverflow.com/questions/1147452

  •  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 عندما تنتهي مع ذلك، فإن الاثنين الآخرين مراجع مستعارة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top