c++ - Cython 中的抽象类(带有纯虚方法)

标签 c++ python oop cython

快速版: 如何在 Cython 中声明一个抽象类?目标是只声明接口(interface),以便其他类可以从它继承,这个类必须没有实现

接口(interface).pxd:

cdef class IModel:
    cdef void do_smth(self)

实现.pyx:

from interface cimport IModel

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

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

ImportError: No module named interface

显然该方法并不是真正的虚拟方法,python 需要 IModel 的实例

更多详情:

我有一个 cython 扩展类 (cdef class Integrator),它应该在任何实例上运行,实现 IModel 接口(interface)。该接口(interface)只是确保实例有一个方法 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 编码人员,请告诉我我应该使用哪种其他方法。

最佳答案

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

关于c++ - Cython 中的抽象类(带有纯虚方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976809/

相关文章:

c++ - ReSharper C++ 中的配色方案困惑

python - cx_Freeze "no module named google"错误

arrays - 如何避免 Matlab 在创建句柄对象数组作为对象属性时占用指数时间

c++ - 如何检查类中传递的参数是否正确

c++ - MSVC : unrecognizable template declaration/definition (compiles with Clang/GCC)

python - Pandas:如何在不循环的情况下使用带有数据帧参数的 applymap/apply 函数

python - 理解 Python super() 和 __init__() 方法

javascript - 定义 Javascript 类原型(prototype)方法

c++ - Qt:在窗口后面模糊

python - 使用 pd.concat 联合多个数据帧