C++;在SWIG中携带自定义Python数据的对象 Pi>是否有一种方法,用于通过SWIG包裹的C++对象,在它们在C++和Python之间来回传递时,携带自定义Python数据?例如:

C++;在SWIG中携带自定义Python数据的对象 Pi>是否有一种方法,用于通过SWIG包裹的C++对象,在它们在C++和Python之间来回传递时,携带自定义Python数据?例如:,c++,python,attributes,swig,C++,Python,Attributes,Swig,示例.h class MyClass { public: int foo; }; // Black box functions. // Only thing guaranteed is that the last object handed to consume // will be returned by eject. void consume(MyClass *obj); MyClass *eject(); 示例.i %module Example %{ #in

示例.h

class MyClass
{
public:
    int foo;
};

// Black box functions.
// Only thing guaranteed is that the last object handed to consume
// will be returned by eject.
void consume(MyClass *obj);
MyClass *eject();
示例.i

%module Example

%{
        #include "example.h"
%}

%include "example.h"
test.py

import Example

a = Example.MyClass()
a.bar = "Puppies"

Example.consume(a)
b = Example.eject()

## Should output "Puppies"
print b.bar
当前输出为“AttributeError:bar”

有没有办法获得这种功能?如果可以自定义SWIG的MyClass的_getattr_uu函数,那么可能可以从内部PyObject*存储和加载未知属性(通过自动创建SWIG子类MyClass,或者通过在MyClass中已经存在这样的对象)

谢谢大家!

这是迄今为止我提出的唯一(部分)解决方案:

class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};


%typemap(in) PyObject* data {
    if(arg1 && arg1->data != NULL)
        Py_DECREF(arg1->data);
    $1 = $input;
    Py_XINCREF($1);
}

%typemap(out) PyObject* data {
    $result = $1;
}
问题

1) SWIG将
$1
设置为
NULL
,而不是现有值,并且我找不到正式的方法来访问typemap中的现有值。以上取决于SWIG将对象(MyClass*)命名为arg1。工作正常,但可能无法在未来的SWIG版本中移植

2) Python代码必须是
a.data.bar=“Puppies”
。这没关系,但并不完美

3) 它要求类具有
数据
成员。这对于我当前的需要是可以的,并且可以由基类来处理

4) 类的析构函数还必须知道数据,并将其清除。同样,对于我目前的需求来说,还行,但有点麻烦。

这是迄今为止我提出的唯一(部分)解决方案:

class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};


%typemap(in) PyObject* data {
    if(arg1 && arg1->data != NULL)
        Py_DECREF(arg1->data);
    $1 = $input;
    Py_XINCREF($1);
}

%typemap(out) PyObject* data {
    $result = $1;
}
问题

1) SWIG将
$1
设置为
NULL
,而不是现有值,并且我找不到正式的方法来访问typemap中的现有值。以上取决于SWIG将对象(MyClass*)命名为arg1。工作正常,但可能无法在未来的SWIG版本中移植

2) Python代码必须是
a.data.bar=“Puppies”
。这没关系,但并不完美

3) 它要求类具有
数据
成员。这对于我当前的需要是可以的,并且可以由基类来处理

4) 类的析构函数还必须知道数据,并将其清除。同样,对于我目前的需求来说,还行,但有点麻烦