【问题标题】:Python subclass with C++ baseclass带有 C++ 基类的 Python 子类
【发布时间】:2009-11-22 11:41:22
【问题描述】:

我通过SWIG 接触过Python 的一些C++。其中有一个带有单个纯虚函数的基类。

在 Python 中,我导入我的模块并定义一个使用抽象类作为基础的类。

import mymodule
class Foo(mymodule.mybase):
    ...

在该模块中也是一个管理器类,我想将我新定义的类添加到管理器中。

m = mymodule.mymanager()
m.add(Foo())

add的定义:

void add(mybase* b) { ... }

没有像我预期的那样工作:

TypeError: in method 'mymanager_add', argument 2 of type 'mymodule::mybase *'

我错过了什么?似乎不确定我的 Foo 类是“mybase”。我尝试在 Python 中添加对基类构造函数的调用,但没有奏效,说该类是抽象的。

def __init__(self):
    mymodule.mybase.__init__(self)

【问题讨论】:

    标签: c++ python swig


    【解决方案1】:

    我的猜测是,Foo 在 C++ 环境的眼中并不是从 mybase 派生而来的。我不确定 SWIG 是否可以实现这一点,因为它需要对继承的双向理解——Python 类使用 C++ 类作为基础,而 C++ 代码识别继承关系。我会认真研究 Boost.python,因为它似乎支持您所追求的功能。 Here's an entry on wiki.python.org about it.

    【讨论】:

      【解决方案2】:

      不是一个真正的答案,但boost.python 可能会让你的运气更好。不知道切换需要做多少工作,但您可能会得到一个简单的继承测试用例,让您的问题快速解决。

      【讨论】:

      • 我先尝试了 boost。安装花了很长时间,最后我还是无法让它工作。我现在在另一个工作站,犹豫再次接受那个庞然大物。您不知道是否有一种快速简便的方法来安装“just”boost.python?
      • 你在哪个平台上?我会认为在 linux/mac 上你可以通过你的包管理器/macports 来获得它。否则恐怕我没有,但boost.org/doc/libs/1_41_0/libs/python/doc/building.html 有一个“不安装快速入门”部分......
      猜你喜欢
      • 2010-11-22
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      相关资源
      最近更新 更多