簡體   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