2012-12-20 4 views
9

빠른 버전 : 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 

이 잘을 컴파일 다,하지만 난 파이썬에서 impl.so를 가져있을 때 나는 다음과 같은 얻을 :

ImportError: No module named interface 

분명히 방법은 사실 가상이 아니 었습니다. 나는 IModel 인터페이스를 구현, 인스턴스에서 작동해야 사이 썬의 확장 클래스 (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 해당이 클래스의 형태로 존재한다 정의 사이몬 헤더 파일 (즉, imodel.pxd),하지만 그렇게 지금까지는 imodel.pyx에 못생긴 더미 구현 클래스를 작성하여 원하는 기능 만 구현할 수있었습니다. 최악의 상황은이 쓸모없는 더미 구현을 컴파일하고 링크하여 다른 cython 클래스가 상속받을 수 있어야한다는 것입니다.

PS : 나는 그것이 사실 당신에게 나쁜 보이는 경우이는, 그러나, 추상 클래스를위한 완벽한 유스 케이스라고 생각합니다, 사랑 OOP 코더는, 내가 사용된다 다른 어떤 접근 말해주십시오.

+2

'cython-devel' 메일 링리스트에 대한 토론 : https : //mail.python.org/pipermail/cython-devel/2014-January/003899.html –

답변

4

이 (discussion) 꽤 불가능 것으로 나타났다. 현재, 인터페이스는 지원되지 않습니다. 분명히 중요한 것은 아니기 때문입니다. 일반적인 상속은 상당히 잘 작동합니다.

0

C에서 추상 클래스를 선언하는 방법 정상 클래스를 선언하지만 해당 클래스에는 적어도 하나의 순수 가상 함수가 있어야합니다. 예 : 클래스 ABC { 가상 무효 쇼() = 모든 에서 0 // 순수 가상 funcn.no의 defn이}

+3

맞습니다. 문제는 Cython에서 그렇게 할 수 없다는 것입니다. – dmytro

관련 문제