代码之家  ›  专栏  ›  技术社区  ›  yageek

将C方法附加到现有Python类

  •  1
  • yageek  · 技术社区  · 12 年前

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

    我深入研究了PythonCApi,但我没有找到合适的方法。

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

    PyMODINIT_FUNC
    PyInit_lambert(void)
    {
        PyObject* m;
    
        m = PyImport_ImportModule("lambert");
    
        /* Some code to attach method */
    
        return m;
    }
    

    有人能给我一些提示吗?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Cuadue    12 年前

    如果简单是一个优点,那么很难击败 ctypes 单元它允许您用Python而不是C编写Python-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,不要试图对接口过于花哨。