首页 > 解决方案 > 如何将手写的 CPython 方法添加到我的 SWIG 包装类

问题描述

我有一个使用 SWIG -builtin 为 Python 包装的 C++ 类。我想为该类添加一个方法,该方法包含在纯 CPython 中,例如,我希望在我的 methoddef 列表中使用它:

{ "handRolledCall", (PyCFunction) _wrap_MyClass_handRolledCall, METH_NOARGS, (char *) "" },

我定义的地方_wrap_MyClass_handRolledCall()。我可以使用 %extend 非常接近:

%extend MyClass {
     PyObject* handRolledCall(PyObject* arg1, PyObject* arg2) {
         // access the C++ value of self with $self
     }
}

但这总是吃掉 Python PyObject 的self. 这意味着无法操作输入对象的 Python 状态,例如,如果我想将其添加到集合中。

我也尝试过使用 %native,正如 Add hand-wrapped method to Swig output中所建议的那样。但那是关于自由函数的,并没有提供向现有类添加方法的方法。

因为我使用的是 SWIG -builtin,所以我不能在 Python 端进行monkeypatch。__enter__我的用例是为一些应该充当上下文管理器的类生成 Python方法。

标签: pythonc++python-3.xswig

解决方案


推荐阅读