12

ゲッターとセッターを使用して、クラスにプロパティを追加できます(単純な場合)。

class<X>("X")
    .add_property("foo", &X::get_foo, &X::set_foo);

したがって、次のようにPythonから使用できます。

>>> x = mymodule.X()
>>> x.foo = 'aaa'
>>> x.foo
'aaa'

しかし、モジュール自体(クラスではない)にプロパティを追加するにはどうすればよいですか?

がある

scope().attr("globalAttr") = ??? something ???

def("globalAttr", ??? something ???);

上記の2つの方法を使用して、クラスのグローバル関数とオブジェクトを追加できますが、クラスの場合と同じ方法でプロパティを追加できないようです。

4

2 に答える 2

3

__getattr__モジュールで__setattr__は呼び出されないため、通常のPythonではハック(モジュールディクショナリにクラスを格納するなど)なしでこれを行うことはできません。それを考えると、BoostPythonでもそれを行うためのエレガントな方法がある可能性はほとんどありません。

于 2010-04-29T06:08:47.947 に答える
3

Python Wiki のboost.python/HowToには、C++ オブジェクトを内部のモジュール属性として公開する例がありますBOOST_PYTHON_MODULE

namespace bp = boost::python;
BOOST_PYTHON_MODULE(example)
{
    bp::scope().attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));
}

BOOST_PYTHON_MODULE使用外の属性を設定するには

bp::import("example").attr("my_attr") = bp::object(bp::ptr(&my_cpp_object));

これで、Pythonで次のようなことができます

from example import my_attr

もちろん、my_cpp_object事前に のクラスを登録し (たとえば、同じ呼び出し内でこれを行うことができますBOOST_PYTHON_MODULE)、C++ オブジェクトの寿命が python モジュールの寿命を超えていることを確認する必要があります。bp::objectC++ をラップする代わりにany を使用できます。

は例外を飲み込むことに注意してください。そのBOOST_PYTHON_MODULEため、間違いを犯した場合、エラー表示は表示されず、BOOST_PYTHON_MODULE生成された関数はすぐに戻ります。このケースのデバッグを容易にするために、内部で例外をキャッチBOOST_PYTHON_MODULEするか、一時的にログ ステートメントを最後の行として追加して、BOOST_PYTHON_MODULE到達したことを確認できます。

BOOST_PYTHON_MODULE(example)
{
    bp::scope().attr("my_attr2") = new int(1); // this will compile
    std::cout << "init finished\n"; // OOPS, this line will not be reached
}
于 2013-07-01T00:03:31.927 に答える