科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件C++ Boost 之Python(继承)

C++ Boost 之Python(继承)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:Lythm 来源:CSDN 2008年5月19日

关键字: python 软件

  • 评论
  • 分享微博
  • 分享邮件

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章