是否可以在Cython中编写“纯”c ++类?

时间:2016-03-28 08:03:41

标签: cython

在Cython中,类或扩展类型是Python类,这意味着它可以由Python初始化。另一方面,其__init____cinit__的参数必须是Python对象。

是否可以在Cython中编写一个类,只能通过cdef函数来启动,因此可以通过C类型和C ++对象来启动它?

我想这样做是因为将现有的Python代码翻译成Cython代码比C / C ++代码更容易。

1 个答案:

答案 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,(虽然它不能有成员函数)。