请写一个示例,示例中包含C++的类库,用Python封装这个C++类,以便于在Python中使用
时间: 2024-10-06 09:00:58 浏览: 21
学习数据结构与算法的代码示例,目前提供 Java、Python、Go、C++ 多种语言支持。.zip
5星 · 资源好评率100%
假设我们有一个简单的C++类`MyCppClass`,它有成员变量和方法:
```cpp
// MyClass.hpp
class MyCppClass {
public:
MyCppClass(int value);
int getValue() const;
private:
int m_value;
};
```
现在我们将这个类封装成Python库。首先,我们需要创建一个Python接口头文件(例如`my_cpp_module_wrap.h`),这通常由工具自动生成:
```cpp
// my_cpp_module_wrap.h (由SWIG或pybind11自动生成)
#include "MyClass.hpp"
extern PyTypeObject MyClass_Type;
#define PY_SimpleWrap(type, name, argcount, docstring) \
static PyObject* name(PyObject* self, PyObject* args, PyObject* kwds); \
static PyMethodDef methods[] = { \
{ #name, name, argcount, docstring }, \
{ NULL } /* Sentinel */ \
}
PY_SimpleWrap(MyCppClass, create_MyCppClass, 1, "Create a new MyCppClass instance");
PY_SimpleWrap(MyCppClass, get_value, 0, "Return the value of the MyCppClass instance");
```
接着,在`my_cpp_module.cpp`里实现这些接口:
```cpp
// my_cpp_module.cpp
#include "my_cpp_module_wrap.h"
#include <PyModuleDef.h>
#include <PyInt_FromLong.h>
// ...其他必要的初始化代码...
PyObject* create_MyCppClass(PyObject* self, PyObject* args) {
int value;
if (!PyArg_ParseTuple(args, "i", &value)) return NULL;
auto* obj = new MyCppClass(value);
return (PyObject*)obj;
}
PyObject* get_value(PyObject* self) {
MyCppClass* obj = reinterpret_cast<MyCppClass*>(self);
return PyInt_FromLong(obj->getValue());
}
PyMODINIT_FUNC init_my_cpp_module(void) {
// ...模块注册和初始化...
Py_INCREF(&MyClass_Type);
m_my_cpp_module.attr("MyClass") = &MyClass_Type;
}
```
最后,你需要编译这个C++模块,并在Python中导入它才能使用:
```python
import my_cpp_module
# 在Python中创建和使用实例
my_obj = my_cpp_module.MyClass(42)
print(my_obj.get_value()) # 输出:42
```
阅读全文