考虑Python中的回调类。
class My_Callback():
def __init__(self):
pass
def do_something(self, something):
print(something)
字符串
这个类在一个DLL Package 器中使用,该 Package 器使用pybind11将其暴露给python。对这个类的引用存储在一个ENUM中,并传递给一个C++函数。
void callPy(py::object f) {
//call f.do_something("test");
}
// ...
callPy(userData::myCallback);
型
有很多关于如何从C++(pybind11 doc)调用Python函数的例子,但是调用类方法的方式是什么呢?感觉好像我应该将py::object
转换为My_Callback
,但我不知道如何做到这一点。
下面的代码行似乎可以完成这项工作,但这真的是预期的方法吗?
void callPy(py::object f) {
py::object mycallback = f.attr("do_something");
mycallback("test");
}
型
1条答案
按热度按时间ikfrs5lh1#
你可以使用attr方法调用一个Python类的绑定函数来获取函数对象,然后以类似于std::function的方式调用它。
字符串
在pybind 11的最新主分支中,他们添加了额外的类型化对象,如果你想更明确地表达你所期望的类型,你可以将str_attr_accessor转换为。
型
如果你想让函数只接受My_Callback类型的对象,并且生成的类型traits是正确的,你必须创建一个py::object的自定义实现来检查My_Callback示例。这个方法还允许你添加一个自定义c++方法来处理do_something属性转换和调用。
型
这也生成了一个更好的帮助文档的功能
关于模块pybind11_example的帮助:
名称pybind11_example
FUNCTIONS内置函数的call_py(...)方法。PyCapsule示例call_py(my_callback:My_Callback)->无
pybind11_loggen也会生成这个
型