【问题标题】:Invoking a method on an object在对象上调用方法
【发布时间】:2009-09-01 19:08:33
【问题描述】:

给定一个指向 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")

【问题讨论】:

    标签: python c embedded-language


    【解决方案1】:
    PyObject* obj = ....
    PyObject *ret = PyObject_CallMethod(obj, "foo", "(s)", "An arg");
    if (!ret) {
       // check error...
    }
    

    阅读Python C API documentation。在这种情况下,您需要object protocol

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

    返回值:新引用。

    以可变编号C调用对象o的名为method的方法 论据。 C参数是 由Py_BuildValue() 格式描述 应该产生一个元组的字符串。 格式可能是NULL,表示 没有提供任何论据。 返回调用的结果 成功,或NULL 失败。这是 相当于 Python 表达式o.method(args)。注意 如果你只通过PyObject * argsPyObject_CallMethodObjArgs() 是一个 更快的选择。

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

    返回值:新引用。

    调用对象o的一个方法,其中给出了方法的名称 作为名称中的 Python 字符串对象。它 以可变数量调用 PyObject* 参数。论据是 作为可变数量提供 参数后跟NULL。退货 成功调用的结果,或 NULL 失败。

    【讨论】:

    • 知道什么是“对象协议”是个问题。另外,我出于某种原因正在寻找调用。谢谢。
    【解决方案2】:

    你的例子是:

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

    【讨论】:

    • 我知道它已经晚了 7 年,但是 (s) 在 arg 格式中是什么意思?
    • 它与 Py_BuildValue 使用的格式字符串相同:括号表示它将构建一个元组,s 表示下一个参数(“An arg”)将是一个 C char* 字符串,转换为Python 字符串。元组用作函数的位置参数,所以我们传递一个字符串。
    • 如果我想将 c 数组作为字符串列表或双精度列表传递,例如 ['kks', 'sss','www','sse'][323.9, 32, 443, 434.8,56.6],该怎么办?
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多