CPython-如何使用uu dict_uu创建方法属性并将其添加到对象?

CPython-如何使用uu dict_uu创建方法属性并将其添加到对象?,python,cpython,Python,Cpython,这可能是一个棘手的问题 简而言之,我创建并添加了一个方法,如下所示: static PyObject *ret_arg(PyBVHTree *self, PyObject *arg) { /* just to demonstrate */ return arg; } static PyMethodDef my_meth = {"ret_arg", (PyCFunction)ret_arg, METH_O, 0}; ... PyObject* func =

这可能是一个棘手的问题

简而言之,我创建并添加了一个方法,如下所示:

static PyObject *ret_arg(PyBVHTree *self, PyObject *arg)
{
    /* just to demonstrate */
    return arg;
}
static PyMethodDef my_meth = {"ret_arg", (PyCFunction)ret_arg, METH_O, 0};       

...
    PyObject* func = PyCFunction_New(&my_meth, my_object);
    Py_DECREF(my_object);
    PyObject_SetAttrString(my_object, "ret_arg", func);
    Py_DECREF(func);
    return my_object;
}
它起作用了!但是有一些问题:(

例如:

  • 如果我删除我的_对象并使用新方法,CRASH
  • 当我用python关闭程序时。错误:异常\u访问\u冲突。refcount没有问题
所以我的问题是:


正确的方法是什么?

我对Python C API一点也不了解,但一般来说,您不想直接向对象添加方法,而是想将它们添加到类中,然后类的实例将自动看到它们。您是否有意改变做法?不,这是您认为需要的。您可能不想这样做我根本不想这样。这就是为什么我问你要解决什么问题,你完全忽略了这个问题。不管怎样:你可以做一个CPython函数,它以一个对象作为参数。所以,只对有意义的对象调用它。你仍然拒绝解释你要解决的问题,然后你就不会得到v回答得很好。这不是一种利用他人时间的非常聪明的方法。如果没有原始索引,你也可以让它返回None。在任何情况下,任意将方法附加到对象都是没有意义的。而且在对象被删除后调用这些方法显然会崩溃。你尝试的解决方案根本不是正确的,哟你需要后退一步。我现在接受不返回解决方案。添加方法而不遭受崩溃比解决方案更具挑战性。谢谢@LennartRegebro