2016-03-28 19 views
1

Cythonでは、クラスまたは拡張タイプはPythonクラスです。つまり、Pythonで初期化できます。一方、その__init__または__cinit__のパラメータは、Pythonオブジェクトでなければなりません。Cythonに「純粋な」C++クラスを書くことは可能ですか?

Cythonでクラスを書くことは可能ですか?これはcdef関数でのみ初期化でき、Cの型とC++オブジェクトで初期化できますか?

私はこれを望むのは、既存のPythonコードをC/C++コードよりもCythonコードに変換する方が簡単だからです。

+1

私は、cdef cppclassでC++クラスを書くことが可能であることを発見しました。ただし、デストラクタ関数、オーバーロードコンストラクタなどの多くのC++機能はサポートされていません。将来のバージョンでサポートされるかもしれませんか? – iuradz

答えて

0

あなたは非常に簡単に(私は実際にコミット疑う同じを使用することができます(簡単に)はPythonから初期化することはできませんが、唯一のcdefファクトリ関数から

cdef class ExampleNoPyInit: 
    cdef int value 

    def __init__(self): 
     raise RuntimeError("Cannot be initialise from python") 

cdef ExampleNoPyInit_factory(int v): 
    cdef ExampleNoPyInit a 

    # bypass __init__ 
    a = ExampleNoPyInit.__new__(ExampleNoPyInit) 
    a.value = v 
    return a 

inst = ExampleNoPyInit_factory(5) 

を作成することができるクラスを作成することができますもしあなたがもっと徹底したいのであれば、初期化を防ぐ他の方法があります。例えばCythonモジュール内のcdefグローバル変数をフラグとして使うことができます。これはPythonからアクセスされません) 。

まだこのクラスにはPythonリファレンスカウントメカニズムが組み込まれているため、まだ「Pythonクラス」です。それを避けたいのであれば、cdef structを使うことができますが(メンバー関数を持つことはできません)。

関連する問題