[英]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.