gpt4 book ai didi

python - 事后将成员函数添加到 Boost Python 类?

转载 作者:行者123 更新时间:2023-11-30 03:42:23 25 4
gpt4 key购买 nike

在 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 之间使用逗号,则加分。

最佳答案

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);

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

Bonus points if someone can explain exactly what def is doing and why I don't need commas in between defs.

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

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。我不知道你需要逗号做什么。

关于python - 事后将成员函数添加到 Boost Python 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36851717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com