KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 318|回复: 2

从kbengine中提取出来python绑定到C++模块,实现python、C++相互...

[复制链接]

8

主题

16

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2018-9-17 13:18:13 | 显示全部楼层 |阅读模式
本帖最后由 xiaoyu 于 2018-9-17 13:21 编辑

从kbengine中提取出来python绑定到C++模块,实现python、C++相互调用, 以及导出C++类和对象到python模块中
github 地址: https://github.com/MirLegend/C-PythonBinding
kbengine中的 pyscript库
  KBEngine 引擎使用了流 行的python脚本用作上层逻辑处理,  kbe作者对python了如指掌,实现了功能强大的pyscript层,开发者只需继承ScriptObject类,
并且灵活使用一些宏扩展,便可以写出各种功能用途的类和对象导出到python模块里面使用(python类也可继承C++类)。
KBEngine中 entity、Proxy、Vector234、MemoryStream 都是继承该类。
python模块可以继承entity类。  
ScriptObject中核心是BASE_SCRIPT_HREADER(CLASS, SUPERCLASS)这个宏,  该宏主要定义PyTypeObject所需的PyMethodDef、PyMemberDef、PyGetSetDef、tp_init、tp_alloc、tp_new、tp_free。
而installScript函数正式组合导出类所有函数属性成员。
继承C++类的python对象的生成。
  生成一个python对象既可以在python中生成,也可以在C++中生产python 对象,  在python中生成对象跟其他普通python对象没什么区别,只是要实现PyTypeObject的tp_alloc。   
在C++中生产一个python对象
有两个关键步骤:

     1.  PyObject * pObject = PyType_GenericAlloc((PyTypeObject*)pyClass, 0);  
2.  Unit* pUnit = new (pObject) Unit(id);     

PyType_GenericAlloc使用python接口创建一个python对象内存空间,并且refcnt=1,  大小什么的在PyTypeObject里面描述了,
因为python是C语言实现,所以C++对象构造函数并没有执行,
第二个步骤就是在某个内存中执行C++类的构造函数。

(这个思路 其实在暗黑战神服务器中也有类似步骤, 在lua中申请空间, 在C++中执行构造,这样来看其实python、lua在大的方向上其实并无二异)

C-PythonBinding
  C-PythonBinding 仅仅是使用pyscript的一个测试demo 实现自定义一个C++类 Unit,导出到python中,可供python类继承。
  C++实现的Unit类,导出到python中让python模块继承

  python模块继承C++实现的Unit类



回复

使用道具 举报

4

主题

23

帖子

82

积分

注册会员

Rank: 2

积分
82
QQ
发表于 2018-10-17 11:08:13 | 显示全部楼层
学习,mark一下
回复

使用道具 举报

6

主题

25

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2018-11-3 22:03:35 | 显示全部楼层
没看懂,看不懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-10 19:11 , Processed in 0.033245 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表