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

时间:2014-02-10 16:55:27

标签: python c native

我想知道是否可以在不使用SWIG或其他框架的情况下向Python类添加本机方法。

我深入研究了Python C Api,但我没有看到合适的方法。

我想我应该有一个init方法来加载现有模块并为其添加一个方法:

PyMODINIT_FUNC
PyInit_lambert(void)
{
    PyObject* m;

    m = PyImport_ImportModule("lambert");

    /* Some code to attach method */

    return m;
}

有人可以给我一些提示吗?

1 个答案:

答案 0 :(得分:1)

如果简单是一个品质因素,那么很难击败ctypes模块。它允许你用Python编写Python-C接口,而不是C.根据我的经验,它比编写Python扩展要容易得多。我想有一些开销,所以如果在内循环中调用它,你可能会看到性能问题。

过去我刚刚重写了C中最内层的循环。

然后,您可以使用普通的旧Python进行子类化。

from some_module import SomeClass

import ctypes

my_c_func = do_the_ctypes_stuff() # see ctypes doc (linked above)

class WrappedClass(SomeClass):
    def added_method(self, *args, **kwargs):
        cargs = my_process_py_args(*args, **kwargs)
        cret = my_c_func(*cargs)
        my_apply_c_result(self, *cret)
        return my_make_py_result(self, *cret)

我的建议是编写普通的Python和普通的C,不要试图对界面过于花哨。