如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递

Posted

技术标签:

【中文标题】如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递【英文标题】:How do I pass a instance member function as a PyCFunction type using the Python C/C++ Interface 【发布时间】:2014-04-04 17:51:33 【问题描述】:

我正在尝试将 python 嵌入到现有的 C++ 应用程序中。但是我一直试图从 python 脚本中调用实例成员函数。

我有一个现有的类,其中我有一个私有成员函数,它包装了本机函数并满足 PyCFunction 接口。

class MY_CLASS 
    public:
        void MY_CLASS();
        void submit(TypeA a, int b);
    private:
        PyObject* PythonMethod_submit(PyObject*, PyObject*);

当我创建 PyMethodDef 时,我使用方法名称来标识我想要的函数,但是我收到一个编译错误,表明我必须使用错误的类型签名。

MY_CLASS::MY_CLASS() 
    // Python C/API Intilization stuff

    PyMethodDef ModuleMethods[] =  
        "submit", 
         PythonMethod_submit, 
         METH_VARARGS, 
         "docstring"  
    ;

    Py_InitModule("myclass", ModuleMethods);

    // Further interaction with the embeded interpreter


如果我使用 Python C API 中描述的静态函数,则此过程有效,当我使用类成员时,我收到错误断言 PyObject* (MY_CLASS::)(PyObject*, PyObject*) does not match PyObject* (*)(PyObject*, PyObject*)

是否可以按照错误中的说明将成员函数作为函数指针传递?

【问题讨论】:

【参考方案1】:

没有。非静态成员函数具有隐式传入的MY_CLASS *(如this),而行为类似于C 函数的静态成员函数则没有。有关不同类型的签名,请参阅此页面:http://www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.html

作为替代方案,您可以在 Python 对象中拥有一个成员,该成员包含指向 C++ 对象的指针 (MY_CLASS *)。

【讨论】:

以上是关于如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递的主要内容,如果未能解决你的问题,请参考以下文章

如何查看Python对象的属性

如何查看Python对象的属性

如何判断Class c,c是某个接口的实现类

如何从python类中删除实例

C++--C++对象模型分析c++中的抽象类和接口

C/C++实现nodejs扩展接口 node-addon-api