Оператор = в Boost :: Python - PullRequest
       28

Оператор = в Boost :: Python

1 голос
/ 18 декабря 2009

Если у меня есть что-то вроде следующего класса

class Foo
{
private:
    int _bar;
public:
    Foo& operator=( const Foo& other )
    {
        _bar = other._bar;
        return *this;
    }
}

Есть ли простой способ экспортировать эту функциональность в python, используя boost :: python? Документация не перечисляет, а приятно и просто

.def( self = self )

Я не эксперт по python, поэтому даже не знаю, нужно ли это, если честно. Но я хочу, чтобы эта функциональность была в моих скриптах на python, поэтому я отправляю вопрос только для того, чтобы убедиться.

Edit:

вот ошибки компилятора, когда я делаю .def (self = self)

.\src\Python.cpp(12) : error C2780: 'boost::python::class_<W> &boost::python::class_<W>::def(const char *,Fn,const A1 &,const A2 &,const A3 &)' : expects 5 arguments - 1 provided
        with
        [
            W=Foo
        ]
        depends\common\include\boost/python/class.hpp(265) : see declaration of 'boost::python::class_<W>::def'
        with
        [
            W=Foo
        ]
.\src\Python.cpp(12) : error C2780: 'boost::python::class_<W> &boost::python::class_<W>::def(const char *,Fn,const A1 &,const A2 &)' : expects 4 arguments - 1 provided
        with
        [
            W=Foo
        ]
        depends\common\include\boost/python/class.hpp(249) : see declaration of 'boost::python::class_<W>::def'
        with
        [
            W=Foo
        ]
.\src\Python.cpp(12) : error C2780: 'boost::python::class_<W> &boost::python::class_<W>::def(const char *,A1,const A2 &)' : expects 3 arguments - 1 provided
        with
        [
            W=Foo
        ]
        depends\common\include\boost/python/class.hpp(242) : see declaration of 'boost::python::class_<W>::def'
        with
        [
            W=Foo
        ]
.\src\Python.cpp(12) : error C2780: 'boost::python::class_<W> &boost::python::class_<W>::def(const char *,F)' : expects 2 arguments - 1 provided
        with
        [
            W=Foo
        ]
        depends\common\include\boost/python/class.hpp(233) : see declaration of 'boost::python::class_<W>::def'
        with
        [
            W=Foo
        ]
.\src\Python.cpp(12) : error C2784: 'boost::python::class_<W> &boost::python::class_<W>::def(const boost::python::def_visitor<Derived> &)' : could not deduce template argument for 'const boost::python::def_visitor<Derived> &' from 'boost::python::self_ns::self_t'
        with
        [
            W=Foo
        ]
        depends\common\include\boost/python/class.hpp(223) : see declaration of 'boost::python::class_<W>::def'
        with
        [
            W=Foo
        ]

Ответы [ 3 ]

4 голосов
/ 19 декабря 2009

Вам не нужно выставлять свой оператор присваивания Python. В python оператор присваивания не переназначает существующий объект как копию другого, он переназначает имя другому объекту. В python вы либо создаете новый объект, либо создаете новый объект, который является копией другого , который больше похож на конструктор копирования.

Если по какой-то причине вам нужно вызвать оператор присваивания C ++ из python, вы, вероятно, можете (не пробовал сам) добавить функцию-член для этого следующим образом:

.def("reassign", &Foo::operator=);

Затем вы вызываете его вручную в python:

f1 = Foo()
f2 = Foo()
f2.reassign(f1)
3 голосов
/ 19 декабря 2009

Я не эксперт по Python, но в python воздействие на оператор "=" не имеет того же значения, что и в C ++: a=b создает новую ссылку на тот же внутренний объект, поэтому нет смысла в экспорт operator= с ++ в интерфейс Python.
Что вы можете сделать, это создать функцию-член «клон» (реализованную в терминах operator=), которая будет возвращать дубликат объекта. И импортировать эту функцию в Python.
Кроме того, в Python вы можете использовать конструктор копирования: foo2 = Foo(foo1) (конечно, этот конструктор должен быть определен в интерфейсе c ++ / python)

1 голос
/ 24 января 2015

Предыдущий ответ, использующий Foo::operator= напрямую, не работает. Сделайте это вместо:

void assignFoo(Foo& self, const Foo& other)
{
    self = other;
}

class_<Foo>("Foo")
    .def("assign", assignFoo);

Использование в python:

foo, other = Foo(), Foo()
foo.assign(other)
...