快速版本:如何在 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
The lorenz.pyx
类应该类似于:
from imodel cimport IModel
cdef class Lorenz(IModel):
cdef void get_dx(double[:] x, double[:] dx)
# implementation
And the 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 应该only以类定义的形式存在cython 标头文件(即 imodel.pxd),但到目前为止我只能通过编写一个丑陋的虚拟实现类来实现所需的功能imodel.pyx
。最糟糕的是,必须编译和链接这个无用的虚拟实现,以便其他 cython 类可以继承它。
PS:我认为这是抽象类的完美用例,但是,如果它实际上对您来说看起来很糟糕,亲爱的 OOP 编码人员,请告诉我应该使用哪种其他方法。