0

いくつかのクラスを実装して使用したいBase。Python では次のようになります。

class Base:
    def Enumerate(self):
        d = []
        for attr in dir(self):
            if not attr.startswith('__') and not callable(getattr(self, attr)):
                d.append(attr)
        return d

class One(Base):
    hello = "world"

class Two(Base):
    foo = "bar"

arr = [One(), Two()]

arr[0].Enumerate()
arr[1].Enumerate()

Baseしかし、を使用して C++ でクラスを実装したいと考えていboost::pythonます。

私はたくさんグーグルで検索しましたが、何も見つかりませんでした。に関連するもののように見えboost::python::wrapperます。

誰かがそれを行う方法を教えてもらえますか?

4

1 に答える 1

2

Boost.Python に慣れていない場合は、チュートリアルから始めることをお勧めします。さらに、参考文献は優れたリソースですが、ある程度の経験が必要であり、少し威圧的または難解な場合があります。さらに、Boost.Python はPython/C API全体に便利な機能を提供していないため、開発者は Python/C API に直接コーディングする必要があります。

これは、コメントに記載されている Python コードを含む完全な Boost.Python の例です。

#include <boost/python.hpp>
#include <boost/python/stl_iterator.hpp>

/// @brief dir() support for Boost.Python objects.
boost::python::object dir(boost::python::object object)
{
  namespace python = boost::python;
  python::handle<> handle(PyObject_Dir(object.ptr()));
  return python::object(handle);
}

/// @brief callable() support for Boost.Python objects.
bool callable(boost::python::object object)
{
  return 1 == PyCallable_Check(object.ptr());
}

class base {};

/// @brief Returns list of an object's non-special and non-callable
///        attributes.
boost::python::list enumerate(boost::python::object object)
{
  namespace python = boost::python;
  python::list attributes; // d = []

  typedef python::stl_input_iterator<python::str> iterator_type;
  for (iterator_type name(dir(object)), end; // for attr in dir(self):
       name != end; ++name)
  {
    if (!name->startswith("__")           // not attr.startswith('__')
        && !callable(object.attr(*name))) // not callable(getattr(self, attr))
      attributes.append(*name);           // d.append(attr)
  }

  return attributes; // return d
}

BOOST_PYTHON_MODULE(example)
{
  namespace python = boost::python;
  python::class_<base>("Base")
    .def("Enumerate", &enumerate)
    ;
}

そしてその使用法:

>>> from example import Base
>>> 
>>> class One(Base):
...     hello = "world"
... 
>>> class Two(Base):
...     foo = "bar"
... 
>>> arr = [One(), Two()]
>>> 
>>> arr[0].Enumerate()
['hello']
>>> arr[1].Enumerate()
['foo']

Boost.Python は Python と C++ の間のシームレスな相互運用性を提供する上で優れた機能を果たしますが、可能であれば、C++ ではなく Python で Python を記述することを検討してください。これは単純な例ですが、プログラムは C++ で書かれていることによるメリットはほとんどありません。より広範な例では、非常に細かい部分にすぐに注意を払う必要があり、Pythonic の感覚を維持するための興味深い課題が提示されます。

于 2013-09-17T18:23:26.160 に答える