2016-03-28 41 views
1

在Cython中,類或擴展類型是一個Python類,這意味着它可以由Python初始化。另一方面,其__init____cinit__的參數必須是Python對象。是否有可能在Cython中編寫「純」C++類?

是否有可能在Cython中編寫一個只能由cdef函數初始化的類,因此可以由C類型和C++對象初始化?

我想這樣做是因爲將現有Python代碼翻譯爲Cython代碼比C/C++代碼更容易。

+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(儘管這不能有成員函數)。

相關問題