如何声明Boost.Python C++;使用PyObjects初始化 我想用pythObject编写C++类,从Python访问它们,用现有的Python对象实例引用它们。简而言之,我想在C++类中存储/管理Python对象实例。

如何声明Boost.Python C++;使用PyObjects初始化 我想用pythObject编写C++类,从Python访问它们,用现有的Python对象实例引用它们。简而言之,我想在C++类中存储/管理Python对象实例。,python,c++,boost,boost-python,python-extensions,Python,C++,Boost,Boost Python,Python Extensions,例如: struct Var { PyObject *Test_1; PyObject *Test_2; }; #include <boost/python.hpp> using namespace boost::python; BOOST_PYTHON_MODULE(Var) { class_<Var>("Var", init<std::string>()) .def_readwrite("Test_1", &a

例如:

struct Var
{
    PyObject *Test_1;
    PyObject *Test_2;

};

#include <boost/python.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(Var)
{
    class_<Var>("Var", init<std::string>())
        .def_readwrite("Test_1", &Var::value)
        .def_readwrite("Test_2", &Var::value)
    ;
}
提前非常感谢

问候


FLO

< P>在用Posith.python管理C++中的Python对象时,应该考虑使用类而不是<代码> pyObjult/Cuth>。<代码>对象< />代码非常类似于Python变量,允许C++中的Python ISH代码。此外,它们的行为类似于智能指针,提供引用计数和生存期管理,其中需要使用
PyObject
显式管理引用计数


下面是一个基于原始代码的完整示例,演示了如何使用
boost::python::object
PyObject

#包括
///@brief-Mockup类型,可管理两个Python对象。
结构变量
{
boost::python::objecttest_1;//托管
PyObject*test_2;//必须显式管理
var()
:测试2(无)
{
Py_增量(测试2);
}
~var()
{
Py_DECREF(试验2);
}
};
///@brief辅助函数用于返回对的非借用引用
//自我测试2。这是必要的,因为Boost.Python假定
//从C++传递到python的pyObjt未被借用。
PyObject*var\u test\u 2\u getter(const-var&self)
{
PyObject*object=self.test_2;
Py_增量(对象);
返回对象;
}
///@brief辅助功能,用于管理
///分配给var.test_2的对象。
void var_test_2_setter(var&self,PyObject*object)
{
Py_DECREF(自测试_2);
self.test_2=对象;
Py_增量(自测试2);
}
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class_wvar(“Var”,python::init())
.def_readwrite(“测试_1”,&var::测试_1)
.add_属性(“Test_2”、&var_Test_2_getter和&var_Test_2_setter)
;
}
互动使用:

>类测试:
...     定义初始化(self,a=0,b=2):
...         self.a=a
...         self.b=b
... 
>>>测试=测试(2,2)
>>>从sys导入getrefcount
>>>计数=getrefcount(测试)
>>>导入示例
>>>store=example.Var()
>>>store.Test_1=测试
>>>断言(store.Test_1为测试)
>>>断言(计数+1==getrefcount(测试))
>>>断言(store.Test_1.a==2)
>>>存储测试_1.a=42
>>>断言(test.a==42)
>>>store.Test_2=测试
>>>断言(store.Test_2为测试)
>>>断言(计数+2==getrefcount(测试))
>>>断言(count+2==getrefcount(store.Test_2))
>>>store.Test_2=无
>>>断言(计数+1==getrefcount(测试))
>>>存储=无
>>>断言(计数==getrefcount(测试))

谢谢您的示例!!但是我认为您在BooStyPythOnMyMod中声明了Python类,但是我只希望用PythonObjects来实现C++类。如果想访问它们,我想将一些Python Objutts实例外包给更快的C++类,以获得更好的性能。
class Test:
    def __init__(self, a = 0, b = 2):
        self.a = 0
        self.b = 0


test = Test(2,2)

import Var
newStore = Var
newStore.Test_1 = test