2010-11-12 9 views
31

сказать, что я мой макет объекта определяется как:Создание объекта с использованием языка Python C API

typedef struct { 
    PyObject_HEAD 
    // Other stuff... 
} pyfoo; 

... и мое определение типа:

static PyTypeObject pyfoo_T = { 
    PyObject_HEAD_INIT(NULL) 
    // ... 

    pyfoo_new, 
}; 

Как создать новый экземпляр pyfoo где-то внутри моего расширения C?

ответ

33

Звоните PyObject_New(), а затем PyObject_Init().

EDIT: Лучший способ это call объект класса, так же, как и в самой Python:

/* Pass two arguments, a string and an int. */ 
PyObject *argList = Py_BuildValue("si", "hello", 42); 

/* Call the class object. */ 
PyObject *obj = PyObject_CallObject((PyObject *) &pyfoo_T, argList); 

/* Release the argument list. */ 
Py_DECREF(argList); 
+2

Я согласен, что документация немного немногословный в этом случае. Я обновил свой ответ с помощью требуемого вызова 'PyObject_Init()'. –

+0

Подождите, 'PyObject_Init()' не принимает никаких аргументов, так как вы передаете требуемые аргументы инициализации? – detly

+0

@detly, вам нужно вызвать объект класса. См. Мой обновленный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^