Boost.Python实现Python C/C++混合编程
生活随笔
收集整理的這篇文章主要介紹了
Boost.Python实现Python C/C++混合编程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導出函數
#include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;char const * greet() {return "hello,world";}BOOST_PYTHON_MODULE(hello_ext) {def("greet", greet); } import hello_ext print hello_ext.greet()?
導出默認構造的函數的類
#include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;struct World {void set(string msg) { this->msg = msg; }string greet() { return msg; }string msg; };BOOST_PYTHON_MODULE(hello) //導出的module 名字 {class_<World>("World").def("greet", &World::greet).def("set", &World::set); } import hello planet = hello.World() # 調用默認構造函數,產生類對象 planet.set("howdy") # 調用對象的方法 print planet.greet() # 調用對象的方法?
構造函數的導出:
#include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;struct World {World(string msg):msg(msg){} //增加構造函數World(double a, double b):a(a),b(b) {} //另外一個構造函數void set(string msg) { this->msg = msg; }string greet() { return msg; }double sum_s() { return a + b; }string msg;double a;double b; };BOOST_PYTHON_MODULE(hello) //導出的module 名字 {class_<World>("World",init<string>()) .def(init<double,double>()) // expose another construct.def("greet", &World::greet).def("set", &World::set).def("sum_s", &World::sum_s); } import hello planet = hello.World(5,6) planet2 = hello.World("hollo world")print planet.sum_s() print planet2.greet()?
如果不想導出任何構造函數,則使用no_init:
class_<Abstract>("Abstract",no_init)?
類的數據成員
#include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;struct Var {Var(string name):name(name),value(){}string const name;float value; };BOOST_PYTHON_MODULE(hello_var) {class_<Var>("Var", init<string>()).def_readonly("name", &Var::name) //只讀.def_readwrite("value", &Var::value); //讀寫 } import hello_varvar = hello_var.Var("hello_var") var.value = 3.14 # var.name = 'hello' # error print var.name?
類的屬性
// 類的屬性#include<string> #include<boost/python.hpp>using namespace std; using namespace boost::python;struct Num {Num(){}float get() const { return val; }void set(float val) { this->val = val; }float val;};BOOST_PYTHON_MODULE(hello_num) {class_<Num>("Num").add_property("rovalue", &Num::get) // 對外:只讀.add_property("value", &Num::get, &Num::set);// 對外讀寫 .value值會改變.rovalue值,存儲著同樣的數據。} import hello_num num = hello_num.Num() num.value = 10 print num.rovalue # result: 10?
繼承
// 類的繼承#include<string> #include<iostream> #include<boost/python.hpp>using namespace std; using namespace boost::python;struct Base {virtual ~Base() {};virtual string getName() { return "Base"; }string str; };struct Derived : Base {string getName() { return "Derived"; }};void b(Base *base) { cout << base->getName() << endl; };void d(Derived *derived) { cout << derived->getName() << endl; };Base * factory() { return new Derived; }/*下面的額外的代碼如果去掉會報錯。解決地址:http://stackoverflow.com/questions/38261530/unresolved-external-symbols-since-visual-studio-2015-update-3-boost-python-link/38291152#38291152 */ namespace boost {template <>Base const volatile * get_pointer<class Base const volatile >(class Base const volatile *c){return c;} }BOOST_PYTHON_MODULE(hello_derived) {class_<Base>("Base").def("getName", &Base::getName).def_readwrite("str", &Base::str);class_<Derived, bases<Base> >("Derived").def("getName", &Derived::getName).def_readwrite("str", &Derived::str);def("b", b);def("d", d);def("factory", factory,return_value_policy<manage_new_object>());//} import hello_derived derive = hello_derived.factory() hello_derived.d(derive)?
類的虛函數:
/*類的虛函數,實現的功能是:可以編寫Python類,來繼承C++類 */ #include<boost/python.hpp>#include<boost/python/wrapper.hpp> #include<string> #include<iostream>using namespace boost::python; using namespace std;struct Base {virtual ~Base() {}virtual int f() { return 0; }; };struct BaseWrap : Base, wrapper<Base> {int f(){if (override f = this->get_override("f"))return f(); //如果函數進行重載了,則返回重載的return Base::f(); //否則返回基類}int default_f() { return this->Base::f(); } };BOOST_PYTHON_MODULE(hello_virtual) {class_<BaseWrap, boost::noncopyable>("Base").def("f", &Base::f, &BaseWrap::default_f);} import hello_virtualbase = hello_virtual.Base() # 定義派生類,繼承C++類 class Derived(hello_virtual.Base):def f(self):return 42derived = Derived()print base.f()print derived.f()?
總結
以上是生活随笔為你收集整理的Boost.Python实现Python C/C++混合编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标配2K/120Hz屏!疑似小米平板6工
- 下一篇: 宝马X3、奥迪Q5强敌 新一代奔驰GLC