1
在Cython中,類或擴展類型是一個Python類,這意味着它可以由Python初始化。另一方面,其__init__
或__cinit__
的參數必須是Python對象。是否有可能在Cython中編寫「純」C++類?
是否有可能在Cython中編寫一個只能由cdef函數初始化的類,因此可以由C類型和C++對象初始化?
我想這樣做是因爲將現有Python代碼翻譯爲Cython代碼比C/C++代碼更容易。
在Cython中,類或擴展類型是一個Python類,這意味着它可以由Python初始化。另一方面,其__init__
或__cinit__
的參數必須是Python對象。是否有可能在Cython中編寫「純」C++類?
是否有可能在Cython中編寫一個只能由cdef函數初始化的類,因此可以由C類型和C++對象初始化?
我想這樣做是因爲將現有Python代碼翻譯爲Cython代碼比C/C++代碼更容易。
你可以很容易地創建一個不能(容易)被從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
(儘管這不能有成員函數)。
我發現可以通過cdef cppclass編寫C++類。但是,不支持許多C++功能,如析構函數,重載構造函數。也許他們將在未來版本中得到支持? – iuradz