繁体   English   中英

Cython中的抽象类(使用纯虚方法)

[英]Abstract classes (with pure virtual methods) in Cython

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

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头文件(即imodel.pxd)中以类定义的形式存在,但到目前为止,我只能通过在imodel.pyx编写一个丑陋的虚拟实现类来实现所需的功能。 最糟糕的是,这个无用的虚拟实现必须被编译和链接,以便其他cython类可以继承它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM