【问题标题】:Add member functions to a Boost Python class after the fact?事后将成员函数添加到 Boost Python 类?
【发布时间】:2016-04-25 21:50:04
【问题描述】:

在 Boost Python 中,您可以像这样向 Python 公开 C++ 类:

object obj = class_<MyClass>("MyClass")
    .def("SomeFunc", &MyClass::SomeFunc)
    ;

假设 MyClass 也有一个函数 SomeOtherFunc。以后有没有办法在 BOOST_PYTHON_MODULE 代码中将 SomeOtherFunc 暴露给 Python?我尝试使用返回的对象,但它没有属性 def。我还尝试再次实例化 MyClass 的公开,但这只是覆盖了第一个。基本上我正在寻找这样的东西:

obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc)

我要解决的更大问题是,我有许多从模板化基类继承的类,我正试图找到一种方法以干净的方式将它们公开给 Python。到目前为止,我已经制作了一个模板函数,它接受类及其模板参数并构造必要的 class_ 调用,但我可能想稍后修改公开类的定义,所以我不知道该怎么做.

如果有人能准确解释“def”在做什么以及为什么我不需要在 def 之间使用逗号,则可以加分。

【问题讨论】:

    标签: python c++ boost


    【解决方案1】:

    obj 没有名为def 的成员函数,但class_ 有。 class_ 继承自 object,这就是该分配有效的原因,但您没有必须这样做。以下工作正常:

    auto obj = class_<MyClass>("MyClass")
        .def("SomeFunc", &MyClass::SomeFunc)
    ;
    
    // now obj is an instance of py::class_<MyClass> instead of py::object
    obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc);
    

    您从未命名class_ 实例这一事实可能会分散人们对这是一个简单构造函数这一事实的注意力。您也可以将上述内容写为:

    class_<MyClass> obj("MyClass");
    obj.def("SomeFunc", &MyClass::SomeFunc);
    obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc);
    

    您不必一次性定义所有内容。

    如果有人能准确解释 def 正在做什么以及为什么我不需要在 def 之间使用逗号,则可以加分。

    def 是类模板class_ 上的成员函数。它有一个bunch of overloads,所有这些都返回一个对self的引用:

    template <class Init>         class_& def(Init );
    template <class F>            class_& def(char const*, Fn );
    template <class Fn, class A1> class_& def(char const*, Fn, A1 );
    // etc.
    

    这就是为什么你可以把它们锁起来。每个调用都独立设置内部机制以将该函数公开给 python 并返回*this。我不知道你需要逗号做什么。

    【讨论】:

    • 啊,水部分和底部都清楚了!谢谢你的解释。实际上,我之前曾尝试使用 auto ,但它对我不起作用。回首往事,我现在意识到我将它与返回“对象”的函数的输出一起使用,难怪它不起作用。感觉现在对Boost Python有了更清晰的认识,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多