在之前的一篇博客Cython调用C++函数例子中,我参照Cython文档练习了用Python通过Cython调用C++库中的函数的例子。不过这个例子中,只有一个C++类,而且所有返回对象都是系统预定义的int,void之类的。
然而我的目标是返回一个可以调用C++类函数的Python类对象。而且是在类A中生成一个类B的对象返回。
摸索一番后,我终于学会了实现这个功能的方法。
下面是把官方文档的例子简单扩展一下用来联系的例题。
C++代码
h文件
在官方文档的基础上,添加了一个Triangle类。另外把所有的int类型变量换成了double类型。
Rectangle.h:
1 | namespace shapes { |
cpp文件
Rectangle.cpp:
1 |
|
pyx文件
rect.pyx:
1 | cdef extern from "Rectangle.h" namespace "shapes": |
rect.pyx文件改动比较大。除了增加了PyTriangle类之外,还在PyRectangle类中中加了一个函数**get_lower_triangle(self)**,这个函数是原本C++类中没有的。从这一点可以更直观的理解我通过前一个例子体会到的三点收获:
- Cython连接C++的函数是是通过Python类的函数->cppclass->C++函数实现的。
- Python类的函数名称不一定要和C++函数名称一直,只要接口定义好到底调用哪个函数就行。
- Python类的函数数目也不一定要和C++函数一致,只需要保证Python想调用的C++函数已经定义且能够找到就行。
setup.py文件
setup.py:
1 | from distutils.core import setup |
这个文件的内容没有发生变化。
编译
编译方法和Cython调用C++函数例子中一样。
测试运行
修改run.py脚本:
1 | import rect |
运行后输出结果:
1 | <type 'rect.PyTriangle'> |
总结
我想返回的是Python中用的类的对象,不需要在C++类中也写一个一样的函数然后再转换。