在Cython中,一个类或扩展类型是Python类,这意味着它可以由Python初始化。另一方面,其__init__
或__cinit__
的参数必须是Python对象。
是否有可能在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)
(我怀疑真正提交的对象可以使用相同的方法在Python中对其进行初始化。如果您想更全面地了解,可以采用其他方法来防止初始化-例如,您可以在Cython模块中使用cdef全局变量。作为一个标志,将无法从Python访问该标志。)>
此类仍具有内置的Python参考计数机制,因此仍然是“ Python类”。如果要避免这种情况,可以使用cdef struct
(尽管不能具有成员函数)。