利用boost.python 扩展python

前两天,写了一个利用boost.python封装C++函数供Python调用。今天,需要学习boost.python封装C++的类,供Python使用。因此,又是查了一堆资料。

讲的比较简洁http://blog.sina.com.cn/s/blog_71cc5f2101018jkp.html

boost官方文档:

http://write.blog.csdn.net/postedit?ref=toolbar&ticket=ST-152285-gnBGvONCmDqgLMwN7cko-passport.csdn.net

如果英语不是很好,可以参考这份中文的,和官方文档差不多

http://hwcrazy.com/922cfce470b611e196c2000d601c5586/97ce183670b611e196c2000d601c5586/

一个简单的例子:

http://www.2cto.com/kf/201507/415354.html

通过Boost.Python可以在Python内使用C++类和函数。和SWIG一样Boost.Python简化了编写Python扩展的代码,而不用使用Python/C API。但与SWIG不同,Boost.Python是一个类库,无需再使用接口文件。

1.初始化和方法列表
在Boost.Python中可以通过使用BOOST_PYTHON_MODULE来命名模块名。在BOOST_PYTHON_MODULE中则可以使用def来实现使用Python/C API定义的方法列表。以下是一个简单的例子。

    
void show()      // 声明show函数
{
cout << 'Boost.Python';
}
BOOST_PYTHON_MODULE(example)  // 使用BOOST_PYTHON_MODULE命名模块名为“example”
{
def('show',show);   // 相当于定义方法列表
}

2.导出类
通过Boost.Python可以将在C++中定义的类及其方法、属性等导入Python中。以下程序在C++中定义一个Message类,然后通过BOOST_PYTHON_MODULE将其导入Python中。

    
#include 
#include 
#include 
using namespace boost::python;
#pragma comment(lib, 'boost_python.lib')
class Message
{
public:
std::string msg;
Message(std::string m)
{
msg = m;
} 
void set(std::string m) 
{ 
msg = m;
}
std::string get()
{ 
return msg; 
}

};
BOOST_PYTHON_MODULE(Message)
{
class_('Message', init())
.def('set', &Message::set)
.def('get', &Message::get)
;
}

以下代码在Python中使用编译好的Message模块。

    
>>> import Message
>>> c = Message.Message('hi')
>>> c.get()
'hi'
>>> c.set('Boost.Python')
>>> c.get()
'Boost.Python'

3.类的成员属性
在C++中类的成员可以使用关键字声明为不同的属性。而在Python中则依靠类属性的命名方式。使用Boost.Python可以将其C++中类成员的属性传递给Python。如下所示代码使用Boost.Python来处理类成员的属性。将BOOST_PYTHON_MODULE中的代码改为如下所示。

    
BOOST_PYTHON_MODULE(Message)
{
class_('Message', init())
.def('set', &Message::set)
.def('get', &Message::get)
.def_readwrite('msg', &Message::msg);
;
}

此处将Message类中的成员msg设置为可读写,还可以使用“.def_readonly”将其设置为只读属性。对于类中的私有成员还可以使用“.add_property”将其操作函数设置为Python类中的属性。如下代码使用“.add_property”对私有成员进行操作。

    
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
}

以下代码在Python中使用编译好的Message模块。

    >>> import Message
>>> s = Message.Message('hi')
>>> s.msg
'hi'
>>> s.msg = 'boot'
>>> s.msg
'boot'


4.类的继承
C++中类的继承关系也可以通过Boost.Python反映到Python模块中。以下代码将父类和子类分别导入到Python模块中。

 

    
#include 
#include 
#include 
using namespace boost::python;
#pragma comment(lib, 'boost_python.lib')
class Message
{
public:
std::string msg; 
Message(std::string m)
{
msg = m;
} 
void set(std::string m) 
{ 
msg = m;
}
std::string get()
{ 
return msg; 
}

};
class Msg:public Message
{
public:
int count;
Msg(std::string m):Message(m)
{
}
void setcount(int n)
{
count = n;
}
int getcount()
{
return count;
}
};
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
class_

5.运算符重载
在Python中运算符重载实际是类专有方法的重载。在C++中对运算符重载后,通过Boost.Python可以传递给Python。如下代码将Msg类的“+”运算符重载,然后通过“.def(self + self)”传递给Python。

    
class Msg:public Message
{
public:
int count;
Msg(std::string m):Message(m)
{
}
void setcount(int n)
{
count = n;
}
int getcount()
{
return count;
}
int operator+ (Msg x) const
{
int r;
r = count + x.count;
return r;
}
};
BOOST_PYTHON_MODULE(Message)
{
class_('Message',init())
.add_property('msg',&Message::get,&Message::set);
class_

对于其他的运算符重载也可以使用同样的方法,如下所示。

    
.def(self - self)            // 相当于_sub_方法
.def(self * self)   // 相当于_mul_方法
.def(self /self)    // 相当于_div_方法
.def(self < self);           // 相当于_lt_方法

6.使用Boost.Python在C++中嵌入Python
在C++中嵌入Python的主要问题是C++与Python之间的数据类型的转换。Boost.Python对Python/C API进行封装,可以使用类似于Python的方式对数据进行声明、操作等。在Boost.Python中使用Object类封装了Python/C API中的 PyObject*。Boost.Python定义了与Python中列表、字典等对应的类,如表8-2所示。

表8-2 Boost.Python与Python中部分类的对应关系

 

Boost.Python

Python

list

列表

dict

字典

tuple

元组

str

字符串

 

Boost.Python提供了Python中对象的操作方法。如str类具有lower、split、title、upper等方法。而list类则具有append、count、extend等方法。以下代码使用Boost.Python在C++中嵌入Python。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值