Python 调用对象上的方法

Python 调用对象上的方法,python,c,embedded-language,Python,C,Embedded Language,给定一个指向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

给定一个指向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")
仔细阅读这本书。在这种情况下,您需要

返回值:新引用

调用名为method of object o的方法,方法的变量号为C 论据。C参数是 由
Py\u BuildValue()格式描述
应该生成元组的字符串。
格式可以是
NULL
,表示 没有提供任何参数。 返回调用的结果 成功,或失败时为空。这是 Python的等价物 表达式
o.method(args)
。注意 如果只传递
PyObject*args
PyObject\u CallMethodObjArgs()
是一个 更快的选择

返回值:新引用

调用对象
o
的方法,其中给出了方法的名称 作为名称中的Python字符串对象。信息技术 使用可变数量的
PyObject*
参数。争论是 作为可变数量的 参数后跟
NULL
。退换商品 呼叫成功的结果,或 失败时
NULL

你的例子是:

PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");

知道什么是“对象协议”是个问题。另外,我出于某种原因正在寻找invoke。谢谢。我知道这已经晚了7年,但arg格式中的(s)是什么意思?它与Py_BuildValue使用的格式字符串相同:parens表示它将构建一个元组,s表示下一个参数(“arg”)将是一个C char*字符串,转换为Python字符串。元组用作函数的位置参数,因此我们只传递一个字符串。如果我想将c数组作为字符串列表或双精度列表传递,例如,
['kks',sss','www','sse']
[323.9,32443434.8,56.6]
PyObject* PyObject_CallMethod(PyObject *o, char *method, char *format, ...)
PyObject* PyObject_CallMethodObjArgs(PyObject *o, PyObject *name, ..., NULL)
PyObject* ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");