PythonとC++の間でクラスを共有することは、両方の言語の利点を活用する強力な方法です。Pythonの柔軟性とC++のパフォーマンスを組み合わせることで、より効率的なコードを書くことができます。
この記事では、pybind11
というライブラリを使用して、C++で書かれたクラスをPythonから利用する方法を紹介します。
まず、C++でクラスを定義します。以下に、名前、身長、体重をメンバ変数に持つPerson
クラスの例を示します。
#ifndef PERSON_H
#define PERSON_H
#include <string>
class Person {
public:
Person();
Person(const std::string &name, const int &height, const int &weight);
void SetName(const std::string &name);
std::string GetName() const;
void SetHeight(const int &height);
int GetHeight() const;
void SetWeight(const int &weight);
int GetWeight() const;
double GetBmi() const;
private:
std::string mName;
int mHeight;
int mWeight;
};
#endif
次に、pybind11
を使用して、このクラスをPythonから利用できるようにラップします。
#include "person.h"
#include <pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(person, p) {
py::class_<Person>(p, "Person")
.def(py::init<std::string, int, int>())
.def_property("name", &Person::GetName, &Person::SetName)
.def_property("height", &Person::GetHeight, &Person::SetHeight)
.def_property("weight", &Person::GetWeight, &Person::SetWeight)
.def("get_bmi", &Person::GetBmi)
.def("__repr__", [](const Person &p) {
return "Person('" + p.GetName() + "', " + std::to_string(p.GetHeight()) + ", " + std::to_string(p.GetWeight()) + ")";
});
}
これで、PythonからC++のPerson
クラスを直接使用することができます。この方法を使用すれば、PythonとC++の間でシームレスにデータを共有し、各言語の長所を最大限に活用することが可能になります。
この記事がPythonとC++のクラスの連携についての理解を深める一助となれば幸いです。