У меня есть класс C ++, который упакован для Python с использованием SWIG -builtin. Я хотел бы добавить метод к этому классу, который обернут в чистый CPython, например, я хочу это в моем списке методов:
{ "handRolledCall", (PyCFunction) _wrap_MyClass_handRolledCall, METH_NOARGS, (char *) "" },
, где я определил _wrap_MyClass_handRolledCall()
, Я могу подойти довольно близко, используя% extension:
%extend MyClass {
PyObject* handRolledCall(PyObject* arg1, PyObject* arg2) {
// access the C++ value of self with $self
}
}
Но это всегда съедает значение Python PyObject self
. Это означает, что нет способа манипулировать состоянием Python объекта ввода, например, если я хочу добавить его в коллекцию.
Я также пытался использовать% native, как предложено в Добавить ручной метод к выводу Swig . Но это касается свободных функций и не предоставляет способа добавления методов в существующий класс.
Поскольку я использую SWIG -builtin, я не могу monkeypatch на стороне Python. Мой вариант использования генерирует Python __enter__
методы для некоторых классов, которые должны действовать как менеджеры контекста.