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

问题描述 投票:2回答:1

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

是否有可能在Cython中编写一个只能由cdef函数初始化并因此可以由C类型和C ++对象初始化的类?

我想这样做,因为将现有的Python代码转换为Cython代码比C / C ++代码容易。

cython
1个回答
1
投票

您可以很容易地创建一个无法(轻松)从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(尽管不能具有成员函数)。

© www.soinside.com 2019 - 2024. All rights reserved.