如何将属性添加到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
}