12

快速版: 如何在 Cython 中声明一个抽象类?目标是仅声明接口,以便其他类可以继承它,必须没有此类的实现。

接口.pxd:

cdef class IModel:
    cdef void do_smth(self)

impl.pyx:

from interface cimport IModel

cdef class A(IModel):
    cdef void do_smth(self):
        pass

一切都很好编译,但是当我impl.so在 python 中导入时,我得到以下信息:

ImportError: No module named interface

显然该方法不是真正的虚拟和 python 想要IModel的实例

更多细节:

我有一个 cython 扩展类 ( cdef class Integrator),它应该在任何实例上运行,实现IModel接口。该接口只是确保实例有一个方法void get_dx(double[:] x, double[:] dx),以便集成器可以在每个集成步骤调用它,以便集成模型。这个想法是,可以在 cython 中实现不同的模型,然后以交互方式集成它们并在python脚本中绘制结果。像那样:

from integrator import Integrator # <-- pre-compiled .so extension
from models import Lorenz         # <-- also pre-compiled one, which inherits
                                  # from IModel

mod = Lorenz()
i = Inegrator(mod)
i.integrate()       # this one's really fast cuz no python is used inside

# do something with data from i

该类lorenz.pyx应如下所示:

from imodel cimport IModel

cdef class Lorenz(IModel):
    cdef void get_dx(double[:] x, double[:] dx)
        # implementation

integrator.pyx

from imodel cimport IModel

cdef class Integrator:
    cdef IModel model

    def __init__(self, IModel model):
        self.model = model

    # rest of the implementation

理想情况下,IModel 应该以类定义的形式存在于cython 头文件(即 imodel.pxd)中,但到目前为止,我只能通过在imodel.pyx. 最糟糕的是,必须编译和链接这个无用的虚拟实现,以便其他 cython 类可以继承它。

PS:我认为这是抽象类的完美用例,但是,如果您觉得它实际上看起来很糟糕,亲爱的 OOP 编码人员,请告诉我应该使用哪种其他方法。

4

2 回答 2

6

事实证明这不太可能(讨论)。目前,不支持接口,显然是因为它们不是至关重要的:通常的继承工作得很好。

于 2012-12-24T00:20:51.140 回答
0

如何在 C++ 中声明一个抽象类声明普通类,但该类必须至少有 1 个纯虚函数。例如:class abc{ virtual void show()=0 //纯虚拟funcn.no defn }

于 2012-12-22T08:38:38.747 回答