posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Python 小计

Posted on 2011-05-27 07:35 RTY 阅读(247) 评论(0)  编辑 收藏 引用 所属分类: 转载随笔
这是一个普通的混合使用方式, 但这种方式不能达到脚本真正的灵活性, c++每个属性必须绑定一个唯一的set和get接口提供给python内部访问这个属性 
C/C++ code: 

class sample
{

public:
int m_obj;
int GetValue(){
return m_obj;
}

void SetValue(int v){
m_obj= v;
}
};


class_<sample>("sample")
.add_property("m_obj", &sample::GetValue, &sample::SetValue )





我看过一个公司做的一个系统使用自己开发的python插件模块实现了非常灵活的c++与python交互 
这个系统有一个配置文件, 其中定义着一些属性和接口, 在系统启动时会去分析这些配置然后把它们 
建立在python中, 用户在python中对这些配置定义的属性赋值都会被c++所截获 

下面是按照我的设想去做, 当然下面代码不能运行 因为不支持这样的方式。 
用户在配置文件定义了3个属性 
int obj1, float obj2, string obj3 

把它们绑定到一个通用的接口上 
.add_property("obj1", &bind(&sample::GetValue, 1), &bind(&sample::SetValue, 1 ) ) 
.add_property("obj2", &bind(&sample::GetValue, 2), &bind(&sample::SetValue, 2 ) ) 
.add_property("obj3", &bind(&sample::GetValue, 3), &bind(&sample::SetValue, 3 ) ) 

class sample 

    
public: 
    PyObject* m_objList; 

    int GetValue(int id); 
    void SetValue(int id, PyObject *val); 
}; 

int sample::getValue( int id ){ 
  return m_objList.find(id); 


void sample::SetValue(int id, PyObject *val){ 
    // 这里拿到被改变的数据 传输到另一网络上 
    ... 
    // 将值赋给那个对象。 
    m_objList.find(id) = val; 


这样当一个属性被改变, c++就可以获得所被改变的数据, 然后做一些相关的逻辑处理, 比如将所改变的数据网络传输到另一端机器上。

我查了很多资料 用boost都无法实现(也许我还没了解), 所以来寻求一下大家的技术支持, 给一点建议。