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

Abstract classes (with pure virtual methods) in Cython

本文关键字:方法 抽象类 Cython      更新时间:2023-10-16

快速版本:如何声明一个抽象类在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的实例

我有一个python扩展类(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++中声明抽象类声明普通类,但该类必须至少有一个纯虚函数。例:类abc{//Virtual void show()=0根本没有定义}