2016-09-01 13 views
1

私は2つのクラスを持っています(最も単純なものを想定しましょう、実装は重要ではありません)。 (cythonのDEFSと)私のdefs.pxdファイルには、次のようになります。cythonで別のオブジェクトのメソッドにC++オブジェクトを渡す方法

cdef extern from "A.hpp": 
    cdef cppclass A: 
    A() except + 

cdef extern from "B.hpp": 
    cdef cppclass B: 
    B() except + 
    int func (A) 

(PythonのDEFS付き)マイpyxファイルは次のようになります。

from cython.operator cimport dereference as deref 
from libcpp.memory cimport shared_ptr 

cimport defs 

cdef class A: 
    cdef shared_ptr[cquacker_defs.A] _this 

    @staticmethod 
    cdef inline A _from_this(shared_ptr[cquacker_defs.A] _this): 
     cdef A result = A.__new__(A) 
     result._this = _this 
     return result 

    def __init__(self): 
     self._this.reset(new cquacker_defs.A()) 

cdef class B: 
    cdef shared_ptr[cquacker_defs.B] _this 

    @staticmethod 
    cdef inline B _from_this(shared_ptr[cquacker_defs.B] _this): 
     cdef B result = B.__new__(B) 
     result._this = _this 
     return result 

    def __init__(self): 
     self._this.reset(new cquacker_defs.B()) 

    def func(self, a): 
     return deref(self._this).func(deref(a._this)) 

「事はderef(self._this)が右に動作していることですが、deref(a._this)はdoesnのこのエラーが発生しました:

Invalid operand type for '*' (Python object) 

どのようにして、1つのPythonオブジェクトの内部C++オブジェクトを別の方法に渡すことができますかPythonで?

答えて

1
def func(self, A a): 
    return # ... as before 

あなたはaは(あなたがそれを呼び出すときに型がチェックされている)タイプAであることCythonを伝える必要があります。そうすれば、それはa._thisを知っていて、Pythonの属性検索として扱われません。完了時にタイプを知っている場合は、cdef属性にしかアクセスできません。

関連する問題