なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

pybind11 で C++ から Python クラスのインスタンスを作成したい

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 に回収される。

ということで、メモでした。