在对象上调用方法

9 投票
2 回答
6559 浏览
提问于 2025-04-15 14:00

假设你有一个指向 Python 对象的 PyObject*,那么你该如何调用这个对象的方法呢?文档里从来没有给出过这样的例子:

PyObject* obj = ....
PyObject* args = Py_BuildValue("(s)", "An arg");
PyObject* method = PyWHATGOESHERE(obj, "foo");
PyObject* ret = PyWHATGOESHERE(obj, method, args);
if (!ret) {
   // check error...
}

这相当于

>>> ret = obj.foo("An arg")

2 个回答

3

你的例子可以是:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
9
PyObject* obj = ....
PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
if (!ret) {
   // check error...
}

先去看看Python C API 的文档。在这里,你需要关注对象协议

PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)

返回值:新的引用。

调用对象 o 的方法,方法名为 method,可以传入不同数量的 C 语言参数。这些 C 参数是通过一个 Py_BuildValue() 格式字符串来描述的,这个格式字符串应该能生成一个元组。如果格式是 NULL,那就表示没有提供参数。成功时返回调用的结果,失败时返回 NULL。这相当于 Python 中的表达式 o.method(args)。需要注意的是,如果你只传 PyObject * args,那么 PyObject_CallMethodObjArgs() 是一个更快的选择。

还有

PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)

返回值:新的引用。

调用对象 o 的一个方法,方法名是以 Python 字符串对象的形式给出的,存储在 name 中。这个方法可以接受不同数量的 PyObject* 参数。参数是以可变数量的参数形式提供,最后以 NULL 结束。成功时返回调用的结果,失败时返回 NULL

撰写回答