Простейший пример:
%module test
%inline %{
class MyClass
{
public:
// other operations
PyObject *get_info() { return info_; }
void set_info(PyObject *info) { info_ = info; }
private:
PyObject *info_;
};
%}
например:
swig -python -Wall -c++ test.i
g++ -Wall -Wextra test_wrap.cxx -I/usr/include/python2.6 -o _test.so -shared
python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> foo = test.MyClass()
>>> str = "hi"
>>> foo.set_info(str)
>>> print foo.get_info()
hi
>>>
Но учтите, что в этом случае право собственности на объект не изменилось.Если бы я сделал foo.set_info("hi")
вместо этого, он был бы освобожден, потому что к тому времени, когда он вызвал foo.get_info()
.
, ссылки не были сохранены. Это можно исправить, добавив вызов:
Py_INCREF(info);
внутри set_info()
, но тогда вам потребуется соответствующий DECREF в деструкторе, или, если set_info()
вызывается, когда ссылка уже удерживается, или для создания или присвоения копии.(Или какой-нибудь хороший тип RAII, чтобы сделать все это для вас ...)