在Cython中,类或扩展类型是Python类,这意味着它可以由Python初始化。另一方面,其__init__
或__cinit__
的参数必须是Python对象。
是否可以在Cython中编写一个类,只能通过cdef函数来启动,因此可以通过C类型和C ++对象来启动它?
我想这样做是因为将现有的Python代码翻译成Cython代码比C / C ++代码更容易。
答案 0 :(得分: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)
(我怀疑真正提交的可以使用相同的方法在Python中初始化它。如果你想要更彻底,还有其他方法可以防止初始化 - 例如你可以在你的Cython中使用cdef全局变量模块作为标志,不能从Python访问。
这个仍然类仍然内置了Python引用计数机制,所以仍然是一个“Python类”。如果你想避免这种情况,那么你可以使用cdef struct
,(虽然它不能有成员函数)。