如何将属性添加到boost :: python中的模块?

问题描述:

可以使用一个getter和setter方法(在一个简单的情况下)的属性添加到类:如何将属性添加到boost :: python中的模块?

>>> x = mymodule.X() 
>>> x.foo = 'aaa' 
>>> x.foo 
'aaa' 

但是:

class<X>("X") 
    .add_property("foo", &X::get_foo, &X::set_foo); 

,那么你可以从蟒蛇像这样使用它如何添加属性到模块本身(不是类)?

scope().attr("globalAttr") = ??? something ??? 

def("globalAttr", ??? something ???); 

我可以添加使用上述两种方法全局函数和类的对象,但似乎无法添加属性的方法一样在课堂上。

__getattr____setattr__没有在模块上调用,所以你can't do this在普通Python中没有黑客(就像在模块字典中存储一个类)。鉴于此,在Boost Python中使用它的方法不太可能。

关于Python维基boost.python/HowTo具有将C++对象作为模块属性内BOOST_PYTHON_MODULE的示例:

namespace bp = boost::python; 
BOOST_PYTHON_MODULE(example) 
{ 
    bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object)); 
} 

要设置属性的BOOST_PYTHON_MODULE使用外

bp::import("example").attr("my_attr") = bp::object(bp::ptr(&my_cpp_object)); 

现在可以在python做像

from example import my_attr 

当然,您需要提前注册my_cpp_object的课程(例如,你可以在同一个BOOST_PYTHON_MODULE调用中做到这一点),并确保C++对象的生命周期超过python模块的寿命。你可以使用任何bp::object而不是包装C++。

请注意,BOOST_PYTHON_MODULE燕子例外,所以如果你犯了一个错误,你不会收到任何错误指示和BOOST_PYTHON_MODULE - 生成的函数将立即返回。为了缓解这种情况下的调试,你可以捕捉异常里面BOOST_PYTHON_MODULE或临时增加一些日志语句的BOOST_PYTHON_MODULE最后一行看到它达到:

BOOST_PYTHON_MODULE(example) 
{ 
    bp::scope().attr("my_attr2") = new int(1); // this will compile 
    std::cout << "init finished\n"; // OOPS, this line will not be reached 
}