pybind11 は C++ と Python とで良い感じにやり取りができる C++ ライブラリです。
少し前の記事の記事でも紹介したとおり、わりと使いやすいライブラリです。
ただ、絶妙にドキュメントが足りなかったりして困るケースがあるので、今回はそれの補完用のメモです。 通常、 Python のクラスインスタンスを作成する場合は、以下のようにします。
const auto _module = py::module::import("some_namespace"); const auto instance = _module.attr("SomeClass")();
これで some_namespace.SomeClass
のコンストラクターが呼べて、インスタンスが作成されるのですが、では次のようなパターン。
return py::cpp_function([](py::object cls)) { // });
この場合、ラムダ式の引数として Python のクラスが渡されます。
なので、この状態で cls.attr("__init__")()
などとするのはちょっと違います。
ということで、答え。
const auto instance = cls();
普通にそのまま関数として呼び出せば、コンストラクターが呼び出されます。以上。
ちなみに明示的にクラスインスタンスを消したい場合は、以下のようにすれば消せる。
instance.dec_ref(); // 参照カウンタが0になる (はず) なので、 GC に回収される。
ということで、メモでした。