快速版: 如何在Cython中声明一个抽象类?目标是仅声明接口,以便其他类可以继承它,此类必须 no implementation 。
interface.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
所有很好地编译,但是当我在python中导入impl.so
时,我得到以下内容:
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 header 文件(即imodel.pxd)中的类定义的形式存在,但到目前为止,我只能实现通过在imodel.pyx
中编写一个丑陋的虚拟实现类来实现所需的功能。最糟糕的是,这个无用的虚拟实现必须被编译和链接,以便其他cython类可以继承它。
PS:我认为这是抽象类的完美用例,但是,如果它对您来说实际上看起来很糟糕,亲爱的OOP编码器,请告诉我我应该使用哪种方法。
答案 0 :(得分:5)
事实证明,这是不可能的(discussion)。目前,不支持接口,显然是因为它们不是至关重要的:通常的继承非常有用。
答案 1 :(得分:0)
如何在C ++中声明一个抽象类 声明普通类,但该类必须至少有1个纯虚函数。 ex:class abc { virtual void show()= 0 //纯虚拟funcn.no defn }