如何使用Boost::Python向导出类添加方法而不修改基类?
我有一个C++的类,不能修改。不过,这个类里面有一个std::list<>,我需要在Python扩展中访问这个列表。因为Boost::Python似乎没有直接把std::list转换成Python列表的功能,所以我希望能在C++里写一个方法来完成这个转换。之后,当我把C++的类映射到Python类时,就可以把这个方法附加上去。
我希望能像这样简单地调用这个方法:
baseClassInstance.get_std_list_of_items_as_python_list()
2 个回答
3
为了更一般地回答这个问题,你可以把任何符合要求的C++函数附加到Python导出的class_声明中。
假设有一个类叫foo:
struct foo
{
//class stuff here
}
你可以定义一个自由函数,它的第一个参数是对foo的引用:
int do_things_to_a_foo(foo& self, int a, std::string b, other_type c)
{
//Do things to self
}
然后像导出foo的成员一样导出这个函数:
class_<foo>("foo")
...
.def("do_things_to_a_foo", &do_things_to_a_foo)
...
;
1
Boost提供了一个工具,可以帮助我们包装迭代器,具体的说明可以在这里找到:http://www.boost.org/doc/libs/1_42_0/libs/python/doc/v2/iterator.html
页面末尾的例子对我来说是有效的,你只需要明确地创建转换,比如:
class_<std::list<Item> >("ItemList")
.def("__iter__", iterator<std::list<Item> >());
为了在不改变C++类的情况下进行修改,我习惯创建一个轻量级的包装类,这个包装类是实际类的子类。这样做可以很好地将所有让我的C++对象在Python中使用时感觉舒适的杂七杂八的东西分开。
class Py_BaseClass : public BaseClass {
public:
std::list<Item> & py_get_items();
}