赞
踩
这个星期简直是煎熬,一个星期在设计C++的导出类,让Python可以直接使用,不说一二,立即上网搜刮了一资料,里面有很多详细的教程,例如:http://blog.csdn.net/sunningpig/article/details/6273200 。然后我就开始结合实际需求开始设计这个C++与Python的中间层了,下面是总结一下这个星期的收获吧。
一. 开始时候搜索到可以使用Boost.Python这个库,但是因为种种原因,没有试用,同时自己也想动动手,详细地了解一下C++与Python是怎么交互的,所以决定自己编码设计,最终设计出来使用了很多宏,这样可以统一处理类似的函数,例如:接受一个参数,一个返回值的函数就可以使用同一个宏来处理,看起来也不是非常复杂的。
二. C++类--->C++导出到Python的类,里面包含了C++类的一个指针,感觉像Wrapper.在Python里直接创建导出类,同时C++类也会被创建对象.Python里使用del会调用该C++类的析构函数,这样Python的局部变量在其作用域外就会自动释放,同样C++对象也会自动释放,要留心这点,否则容易出现野指针,因此,我在C++的导出类的析构函数把C++的析构交给对应引擎的自动释放池来管理,首先让自动释放池查找一下该C++对象是否存在于自动释放池,是则由释放池管理,不是则立即释放掉。
三. 注意Python的引用计数,有些Python API会自动帮你引用+1,忘了释放PyObject*, 容易造成内存泄露。在外面如果传进PyObject*,大多数情况需要Py_XINCE来使引用+1,然后记得使用Py_XDECREF来使引用-1.
四. C++导出类的函数也支持static类型,很简单,在设置导出函数数组里增加"METH_STATIC"即可。
五. 神奇的PyArg_ParseTuple,例如:有这个关系Node的子类Scene,它们都有对象的导出类:PY_Node与
PY_Scene,当然它们的导出类就不是父子关系,Node里有这样一个函数:attachChild(CCNode*),其导出函数接受的是PY_Node,我传入PY_Scene,它依然工作正常,函数把PY_Scene转化为PY_Node了。
六. 实现C++的导出类,在Python里继承它,然后重写导出类的函数,可以实现在C++里调用的是重写的那个Python函数,其实这是屏蔽了C++的那个函数,调用了Python的重写函数。这用到了回调函数,我设计大概如下:
C++类的一个名叫:onEnter函数,它属于一个回调函数,在C++其它类会使用,但不会被主动调用,即新创建一个对象不会obj->onEnter这样使用,现在需要在Python里重写那个函数。我先增加一个onEnterDefault函数,将原来onEnter的内容拷贝过来,这作为最本性的onEnter,同时它也提供一个导出函数,作为父类的onEnter,如果在Python里想调用父类的onEnter,就使用它的导出函数。然后在原来的onEnter增加判断是否存在"onEnterPy"(Python里作为重写onEnter的名字),存在就调用onEnterPy,不存在就调用onEnterDefault,即执行原操作了。如下:
def onEnterPy(self):
self.onEnterDefault()
# 新操作
这样看起来是不是接近与C++的重写,如果有其它好办法,告诉我一声,总感觉这样绕了几圈...
打字好累啊...要继续努力啊!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。