我想知道是否可以在不使用SWIG或其他框架的情况下向Python类添加本机方法。
我深入研究了Python C Api,但我没有看到合适的方法。
我想我应该有一个init方法来加载现有模块并为其添加一个方法:
PyMODINIT_FUNC
PyInit_lambert(void)
{
PyObject* m;
m = PyImport_ImportModule("lambert");
/* Some code to attach method */
return m;
}
有人可以给我一些提示吗?
答案 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,不要试图对界面过于花哨。