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

2024-09-21 03:28:01 发布

您现在位置:Python中文网/ 问答频道 /正文

可以使用getter和setter向类添加属性(在简单的情况下):

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

因此,您可以像这样从python中使用它:

^{pr2}$

但是如何将属性添加到模块本身(而不是类)?

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

以及

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

我可以使用上述两种方法添加类的全局函数和对象,但似乎不能像在类中那样添加属性。在


Tags: 模块addget属性foo情况propertysomething
2条回答
Python Wiki上的P>^ {A1}有一个例子,它将C++对象暴露为^ {CD1>}:/P>
namespace bp = boost::python;
BOOST_PYTHON_MODULE(example)
{
    bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));
}

要在BOOST_PYTHON_MODULE之外设置属性,请使用

^{pr2}$

现在您可以在python中执行以下操作

from example import my_attr
当然,你需要预先登记^ {CD3>}类(例如,你可以在同一个^ { CD1>}调用中这样做),并确保C++对象的生命周期超过Python模块的生命周期。可以使用任何^ {< CD5> }而不是包装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
}

__getattr__和{}不是在模块上调用的,因此您可以在普通Python中使用can't do this,而不需要进行任何修改(比如在模块字典中存储一个类)。鉴于此,在boostpython中也不太可能有一种优雅的方法来实现它。在

相关问题 更多 >

    热门问题