如何在不修改基类的情况下使用Boost :: Python向导出的类添加方法?

时间:2010-02-27 21:00:37

标签: c++ python boost-python

我有一个C ++类,我无法修改。但是,该类包含std :: list<>我需要能够在Python扩展中访问的项目。由于Boost :: Python似乎没有std :: list和Python列表之间的内置转换,我希望能够在C ++中编写一个方法,可以为我和以后进行此转换。我将C ++类映射到Python类,我可以附加此方法。

如果我可以像

那样调用方法,我更愿意
baseClassInstance.get_std_list_of_items_as_python_list()

2 个答案:

答案 0 :(得分:3)

要以更一般的方式回答问题,您可以在class_声明中将任何具有正确签名的c ++函数附加到python导出。

假设一个类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 :(得分: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();
  }