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
的实例
我有一个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根本没有定义}
- 对纯抽象类中方法的未定义引用
- 用c++中的纯虚拟方法抽象模板类
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 如何使用抽象类中未包含的方法
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- C :如何在此抽象类的方法中返回抽象类
- 我将如何通过抽象类传递虚拟方法,但可以选择不重写
- 从子类中的抽象类调用方法
- 如何通过方法使用抽象类的子实例?
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 派生类使用的抽象类的方法
- 使用智能指针将右值引用绑定到抽象类的替代方法
- 在抽象基类中与抽象类成员合作的最佳方法
- 使用纯虚拟方法在C 中初始化抽象类
- C++中的抽象类和纯虚方法
- 我们可以通过在C++中的类中使用关键字“abstract”使所有方法抽象来声明接口类吗
- 带有抽象类的unique_ptr成员和Copy构造函数的Factory方法模式
- C++抽象类参数错误解决方法
- 我们是否有更好的方法来返回C++中的抽象类