2011-04-19 62 views

回答

5

我对你的意思并不是100%,但我假设你想要一个构造函数来取一个Python列表,另一个取一个numpy数组。有几种方法可以解决这个问题。最简单的方法是使用make_constructor功能和超载:

using boost; 
using boost::python; 

shared_ptr<MyClass> CreateWithList(list lst) 
{ 
    // construct with a list here 
} 

shared_ptr<MyClass> CreateWithPyArrayObject(PyArrayObject* obj) 
{ 
    // construct with numpy array here 
} 


BOOST_PYTHON_MODULE(mymodule) 
{ 
    class_<MyClass, boost::noncopyable, boost::shared_ptr<MyClass> > 
     ("MyClass", no_init) 
     .def("__init__", make_constructor(&CreateWithList)) 
     .def("__init__", make_constructor(&CreateWithPyArrayObject)) 
} 

您可以更加聪明,在构造函数中使用的参数任意类型/个数。这需要一点巫毒才能完成。有关将原始函数定义作为构造函数公开的方法,请参见http://wiki.python.org/moin/boost.python/HowTo#A.22Raw.22_constructor

+0

谢谢。这看起来很棒! PyArrayObject在哪里定义? (我正在使用MacPorts并安装了py27-numpy,但似乎没有公开任何带有PyArrayObject的头文件。我查找了开发变体,但找不到任何文件。) – 2011-04-19 18:40:46

+0

另外,有没有办法做到这一点boost :: shared_ptr?或者,有没有办法来包装我的其他静态成员函数返回MyClass,以便他们返回shared_ptr? – 2011-04-19 18:45:11

+0

我用shared_ptr得到了这个工作!但是,我仍然无法找到PyArrayObject的任何标题。我会问另一个问题。再次感谢您的详细帮助。 – 2011-04-21 04:38:41

相关问题