代码之家  ›  专栏  ›  技术社区  ›  Jack Edmonds

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

  •  1
  • Jack Edmonds  · 技术社区  · 15 年前

    我有一个C++类,我不能修改。但是,该类持有一个我需要在Python扩展中访问的项目的STD::列表& lt;gt。因为Boosi::Python在STD::list和Python列表之间似乎没有内置的转换,我希望能够在C++中编写一个方法,可以为我做这个转换,稍后,当我把C++类映射到Python类时,我可以附加这个方法。

    如果我能像这样调用方法

    baseClassInstance.get_std_list_of_items_as_python_list()
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Ross Kinder    15 年前

    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++类而不改变它,我习惯于创建一个薄包装器,即类的子类。这是一个很好的地方来分离所有的CRUD,使我的C++对象感到舒适的Python。

      class Py_BaseClass : public BaseClass {
      public:
        std::list<Item> & py_get_items();
      }
    
        2
  •  3
  •   Matthew Scouten    14 年前

    若要以更一般的方式回答问题,可以将任何具有正确签名的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)
       ...
       ;