如何使用原生Python/C API从C++创建Python自定义类型?

2 投票
1 回答
1164 浏览
提问于 2025-04-18 06:16

下面是解释内容:

我定义了一个新的Python类型,叫做“Ex1”。

typedef struct {
    PyObject_HEAD
    PyObject * int_id;
    int * value;

} Ex1;

考虑到这个类型,并且在Python中生成并验证了所有适当的方法(运行得相当不错)。我想从C++后端创建一个新的Ex1类型的Python对象。我需要的典型结构是:

int main 
{
     // Create Ex1 Object.
     Ex1 Example;

     // Call PythonC-API method to include Ex1 Object into the python interpreter.
     // ¿Any function-method from Python API to perform this task?
}

1 个回答

2

其实我通过查阅Python的文档解决了这个问题:

https://docs.python.org/2/extending/newtypes.html

首先,需要按照Python文档中的说明定义合适的方法(1)。假设创建的PyType有两个属性(varp1和varp2):

PyObject * create_Ex1(vartype1 var1, vartype2 var2)
{
    PyObject * pInst = PyObject_CallObject((PyObject *)&Ex1Type, NULL);
    ((Ex1*)pInst)->varp1 = var1;
    ((Ex1*)pInst)->varp2 = var2;    
    return pInst;
}

还有

static int Ex1_init(Ex1 *self, PyObject *args, PyObject *kwds)
{   
    // On init return -1 if error
    self->varp1= NULL;
    self->varp2= NULL;
    return 0;
};

这些是在静态的PyTypeObject Ex1Type中定义的,具体内容可以参考Python文档(1)。

然后,使用这一行代码来创建和初始化对象:

PyObject* Ex1_obj = create_Ex1(var1, var2);

撰写回答