如何在pybind11中从C++调用Python类的方法?
关于pybind11调用Python类方法的标准实现方式
你的实现思路方向是对的,但存在一个关键细节问题:Python的实例方法依赖于实例本身(即self参数),直接通过attr获取方法后调用时,需要显式传入实例作为第一个参数,否则会抛出TypeError。
正确的实现方式有两种:
- 修正原有代码,显式传入实例参数:
void callPy(py::object f) { py::object mycallback = f.attr("do_something"); mycallback(f, "test"); // 传入实例f作为self参数 }
- 使用pybind11提供的
py::call_method工具函数(更推荐的标准写法):
void callPy(py::object f) { py::call_method<void>(f, "do_something", "test"); }
这个函数会自动处理实例方法与实例的绑定,无需手动传入self,是pybind11中调用Python类实例方法的标准方式。
另外,也可以用更简洁的链式调用写法,效果和第一种修正后的代码一致:
void callPy(py::object f) { f.attr("do_something")("test"); }
内容的提问来源于stack exchange,提问作者user_na
相关产品推荐
相关产品推荐

