C++ Boost 之Python(继承)

翻译 2003年07月21日 08:14:00

c++boost.gif (8819 bytes)继承

在Python中继承

用Boost.Python扩展的类在Python中支持单继承和多继承.你可以在派生类中任意地混合内建Python类和扩展类.只要Boost.Python 扩展类是在Python中新的类的基类中, 那么结果就是一个扩展的类:

>>> class MyPythonClass:
...     def f(): return 'MyPythonClass.f()'
...
>>> import my_extension_module
>>> class Derived(my_extension_module.MyExtensionClass, MyPythonClass):
...     '''This is an extension class'''
...     pass
...
>>> x = Derived()
>>> x.f()
'MyPythonClass.f()'
>>> x.g()
'MyExtensionClass.g()'

反射C++继承关系

Boost.Python也允许我们提供C++类之间的继承关系,这样派生类就可以作为参数传递到那些需要基类对象的值,指针,引用的地方. class_builder<>的成员方法declare_base就是用来建立基类和派生类之间关系的方法.

#include <memory> // for std::auto_ptr<>

struct Base {
    virtual ~Base() {}
    virtual const char* name() const { return "Base"; }
};

struct Derived : Base {
    Derived() : x(-1) {}
    virtual const char* name() const { return "Derived"; }
    int x;
};

std::auto_ptr<Base> derived_as_base() {
    return std::auto_ptr<Base>(new Derived);
}

const char* get_name(const Base& b) {
    return b.name();
}

int get_derived_x(const Derived& d) {
    return d.x;
}
    
#include <boost/python/class_builder.hpp>

// namespace alias for code brevity
namespace python = boost::python;

BOOST_PYTHON_MODULE_INIT(my_module)
{
牋?try
牋?{
牋牋牋 python::module_builder my_module("my_module");

牋牋牋 python::class_builder<Base> base_class(my_module, "Base");
牋牋牋 base_class.def(python::constructor<void>());

牋牋牋 python::class_builder<Derived> derived_class(my_module, "Derived");
牋牋牋 derived_class.def(python::constructor<void>());
       // Establish the inheritance relationship between Base and Derived
       derived_class.declare_base(base_class);

       my_module.def(derived_as_base, "derived_as_base");
       my_module.def(get_name, "get_name");
       my_module.def(get_derived_x, "get_derived_x");
牋?}
牋?catch(...)
牋?{
牋牋牋 python::handle_exception();牋?// Deal with the exception for Python
牋?}
}

然后在Python中:

>>> from my_module import *
>>> base = Base()
>>> derived = Derived()
>>> get_name(base)
'Base'
派生的包装类对象可以被传递到需要基类类型的地方
>>> get_name(derived) 
'Derived'
派生的包装类对象可以被传递到需要派生类类型的地方,但是类型信息丢Я?
>>> get_derived_x(derived_as_base()) 
-1

不含虚函数的继承

如果因为某些原因你的基类没有虚函数,但是你仍然希望提供基类和派生类的继承关系,用 boost::python::without_downcast作为declare_base的第2个参数:

struct Base2 {};
struct Derived2 { int f(); };

   ...
牋 python::class_builder<Base> base2_class(my_module, "Base2");
牋 base2_class.def(python::constructor<void>());

牋 python::class_builder<Derived2> derived2_class(my_module, "Derived2");
牋 derived2_class.def(python::constructor<void>());
   derived_class.declare_base(base_class, python::without_downcast);

这个方法允许Derived2对象被传递到需要Base2对象的地方,但是不会引起从Base2灵巧指针到Derived2类型的指针,引用,或者值的隐式转换.

Next: 特殊方法和操作符的支持 Previous: 函数重载 Up: Top

© David Abrahams 2001 版权所有. 本文档允许复制、使用、修改、出售和分发,前提是这个版权声明必须出现在所有的拷贝上。本文档的提供不承担任何直接或隐含的保证,并且不做其适合任一目的之声明。

更新日期: 2000年11月26日

boost.python -- 继承

以官网文为本,尽量翻译下,方便以后看。我使用的boost 版本为1.5.1 。原谅网址:http://www.boost.org/doc/libs/1_51_0/libs/python/doc/tut...
  • LaineGates
  • LaineGates
  • 2012年10月18日 15:39
  • 2610

利用C++ Boost编写扩展Python模块

Python很强大,但已有的模块可能满足不了人民日益增长的物质文化需求,于是有时需要编写扩展模块进行完善。 可行的方案有很多:SWIG、Weave、ctypes、BOOST…… BOOST...
  • normallife
  • normallife
  • 2016年09月16日 17:40
  • 1713

子类继承父类的变量和父类原有变量的关系

做项目的时候错认为在子类中修改从父类继续下来的变量值,会影响到其他继承该变量的子类,实际上不是的,每个继承了这个变量的子类,相当于拷贝了一份变量,对变量的修改影响也仅限于自身,不会影响到父类的变量值,...
  • victory08
  • victory08
  • 2015年08月13日 23:20
  • 4778

Python 面向对象编程(三)继承与多态

在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,可以让一个类去继承一个类,被继承的类称为父类或者...
  • chongtianfeiyu
  • chongtianfeiyu
  • 2014年03月23日 23:27
  • 4699

利用C++ Boost编写扩展Python模块

Python很强大,但已有的模块可能满足不了人民日益增长的物质文化需求,于是有时需要编写扩展模块进行完善。 可行的方案有很多:SWIG、Weave、ctypes、BOOST…… BOOST...
  • normallife
  • normallife
  • 2016年09月16日 17:40
  • 1713

利用C++ Boost编写扩展Python模块

转载自:http://blog.csdn.net/normallife/article/details/52556727 谢谢博主 Python很强大,但已有的模块可能满足不了人民日益增长的...
  • xiaojun111111
  • xiaojun111111
  • 2017年05月15日 14:37
  • 332

一个日历问题的C语言,C++(boost),python,Javascript,Java和Matlab的实现

下面问题的多种语言的解决方法: 根据下列信息计算在1901年1月1日至2000年12月31日间共有多少个星期天落在每月的第一天上? a) 1900.1.1是星期一 b) 1月,3月,5月,7月,8...
  • pdcxs007
  • pdcxs007
  • 2014年12月22日 21:21
  • 1639

Python调用C/C++的接口(Boost)

为c++的程序扩展接口 假设我们已经有写好的c++程序,那么,我们不需要改动原来的c++程序,只需要添加一个接口文件,把我们需要的接口调用boost-python来封装以下吧 原来的c++...
  • wesleyhe
  • wesleyhe
  • 2011年11月15日 08:56
  • 2055

使用boost实现c++与python的相互调用

学习boost.python 模块,我的环境windows上qt5.5 mingw4.92, 设置好环境变量。 1.环境搭建:在python安装包里面有一个include文件夹 里面存放的头文件,还有...
  • tayinyinyueyue
  • tayinyinyueyue
  • 2017年01月19日 19:11
  • 970

使用boost实现python调用c++

使用boost.python实现python调用c++代码 编写c++代码后,编译成动态链接库,然后python可以直接调用 参考http://www.boost.org/doc/libs/1_6...
  • zzucaicai
  • zzucaicai
  • 2016年07月08日 16:06
  • 177
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Boost 之Python(继承)
举报原因:
原因补充:

(最多只允许输入30个字)