如何将C方法附加到现有的Python类?

如何将C方法附加到现有的Python类?

该方法展示了如何从C扩展模块中定义一个新的Python类。该类的方法是由C实现的,但是该类仍然可以通过Python进行实例化、子类化和扩展。同样的继承技术也可以用于将由C编写的方法扩展到现有的Python类中。在这种技术中,将PyClass_New的第一个参数传递为NULL,表示新类没有基类。然后在这个位置传递基类的元组,我们将获得正常的Python继承行为,即使我们的新类是在C扩展中构建而不是在Python源代码中。

例子

#include <Python.h>
static PyObject* Foo_init(PyObject *self, PyObject *args)
{
    printf("Foo.__init__ called\n");
    Py_INCREF(Py_None);
    return Py_None;
}
static PyObject* Foo_doSomething(PyObject *self, PyObject *args)
{
    printf("Foo.doSomething called\n");
    Py_INCREF(Py_None);
    return Py_None;
}
static PyMethodDef FooMethods[] =
{
    {"__init__", Foo_init, METH_VARARGS, "doc string"},
    {"doSomething", Foo_doSomething, METH_VARARGS, "doc string"},
    {0, 0},
};
static PyMethodDef ModuleMethods[] = { {0, 0} };
#ifdef __cplusplus
extern "C"
#endif
void initFoo(  )
{
    PyMethodDef *def;
    /* 创建新的模块和类对象 */
    PyObject *module = Py_InitModule("Foo", ModuleMethods);
    PyObject *moduleDict = PyModule_GetDict(module);
    PyObject *classDict = PyDict_New(  );
    PyObject *className = PyString_FromString("Foo");
    PyObject *fooClass = PyClass_New(NULL, classDict, className);
    PyDict_SetItemString(moduleDict, "Foo", fooClass);
    Py_DECREF(classDict);
    Py_DECREF(className);
    Py_DECREF(fooClass);
    /* 添加方法到类 */
    for (def = FooMethods; def->ml_name != NULL; def++) {
        PyObject *func = PyCFunction_New(def, NULL);
        PyObject *method = PyMethod_New(func, NULL, fooClass);
        PyDict_SetItemString(classDict, def->ml_name, method);
        Py_DECREF(func);
        Py_DECREF(method);
    }
}

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程