在Cython中,类或扩展类型是Python类,这意味着它可以由Python初始化。另一方面,它的__init__或__cinit__的参数必须是Python对象。
有没有可能用Cython编写一个类,它只能由cdef函数初始化,因此可以由C类型和C++对象初始化?
我之所以这样做,是因为将我现有的Python代码转换成Cython代码要比C/C++代码更容易。
发布于 2016-03-28 18:02:02
您可以很容易地创建一个类,该类不能(很容易)从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 (尽管它不能有成员函数)。
https://stackoverflow.com/questions/36258343
复制相似问题