提振.Python对类似的构造函数感到困惑

boost.python confused about similar constructor

本文关键字:构造函数 Python 提振      更新时间:2023-10-16

我有一个类,看起来像

class Foo{
    Foo();
    Foo(int i);
    Foo(bool b);
    Foo(double d);
};

,我像往常一样将类暴露给python

class_<Foo>("Foo")
.def(init<int>())
.def(init<bool>())
.def(init<double>());

当我尝试在python中使用to时,python代码总是将c'tor参数转换为double(它总是类def export中的最后一个)。有没有一种方法可以显式地告诉boost。Python如何显式处理由类型?

你可以改变构造函数定义的顺序,最后一个定义的优先级更高。以下是我的结果:

class_<Foo>("Foo")
.def(init<bool>())
.def(init<double>())
.def(init<int>());
Foo() # calls Foo()
Foo(True) # calls Foo(int)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)

如你所见,这不是一个完美的解决方案。所以,如果你真的需要重载的构造函数,我建议你使用自己的工厂函数。

using namespace boost::python;
static boost::shared_ptr<Foo>
makeFoo(const object& data)
{
    boost::shared_ptr<Foo> obj;
    if (PyBool_Check(data.ptr())) {
        bool val = extract<bool>(data);
        obj.reset(new Foo(val));
    }
    else if (PyFloat_Check(data.ptr())) {
        double val = extract<double>(data);
        obj.reset(new Foo(val));
    }
    else {
        int val = extract<int>(data);
        obj.reset(new Foo(val));
    }
    return obj;
}
class_<Foo>("Foo")
    .def("__init__", make_constructor(makeFoo));

使用makeFoo:

Foo() # calls Foo()
Foo(True) # calls Foo(bool)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)

顺便说一下,python.org上的文档会有所帮助。