Python Cython共享扩展类型:类

Python Cython共享扩展类型:类,python,python-3.x,cython,Python,Python 3.x,Cython,我想用Cython创建一个在Python中可读的类。目前,我的代码看起来像下面的代码,当然它们并不完全相同,但是代码的结构和组织是相同的 据我所知,我们不能直接从Python调用Cython对象,所以我打算让测试类作为包装器工作,它可以调用更快的Cython类。 但是,我在.pyx中发现一个类对象不能在同一个文件中的Cythonized类中调用cdef函数,因此cdef类CYTEST有另一个包装函数def func,这对我来说效率很低。 我原来问题中的这一段结果是错的 我发现我们可以在.pxd

我想用Cython创建一个在Python中可读的类。目前,我的代码看起来像下面的代码,当然它们并不完全相同,但是代码的结构和组织是相同的

据我所知,我们不能直接从Python调用Cython对象,所以我打算让测试类作为包装器工作,它可以调用更快的Cython类。 但是,我在.pyx中发现一个类对象不能在同一个文件中的Cythonized类中调用cdef函数,因此cdef类CYTEST有另一个包装函数def func,这对我来说效率很低。 我原来问题中的这一段结果是错的

我发现我们可以在.pxd文件中声明int、list和object等对象,并且可以从下面示例中.pyx文件中定义的Python类printself.cytest.somenum中读取Cython类中的对象

我们可以用Cythonized类做类似的事情吗?在这个例子中,我们可以在测试类中直接调用Cyfunc吗

main.py的一部分:

在cyobj.pyx中

cyobj.pxd:

没有我的例子

self.main.cyobj2.Cyfunc(num+1) # what I want to do
问题是它不知道self.main.cyobj2是一个CYTEST,因此无法调用Cyfunc

最简单的选择是将其转换为:

cdef CYTEST o = self.main.cyobj2
o.Cyfunc(num+1)
如果强制转换失败,您将得到一个TypeError

第二个选项是将Cyfunc设置为cpdef函数,这样就可以在不知道类型的情况下以正常Python方式调用它


第三个选项可能是将MAIN也设为cdef类,然后指定cyobj1和cyobj2的类型以及CYTEST.MAIN。但是,这可能会导致循环依赖关系出现问题,因此我不完全确定这是否可行。

不确定您想要实现什么。您是否尝试在python中调用CYTESTMAIN?只有'cdef-函数/方法不能从python调用-cdef类'是另一回事儿。@ead哦,它能工作!那么,我们可以从另一个cdef类调用cdef类中的cdef函数吗?在我的示例中,我想调用self.main.cyobj2.Cyfuncnum+1。我尝试了最简单的方法,但仍然得到AttributeError:“cyobj.CYTEST”对象没有属性“Cyfunc”错误。第三种方法可行,但不比调用cpdef函数慢吗?调用cpdef函数稍微慢一点。你的例子的一个修改版本对我来说是可行的,但是我需要先解决一些小问题——你在这里展示的版本确实不是一个很好的例子。没有这一点,很难知道你错在哪里我忘了修改我的实际工作代码,你的评论澄清了这一点!谢谢我忘了删除.pyx中的定义。
cdef class CYTEST:
    cdef public object main
    cdef public int somenum
    cdef public void Cyfunc(self, int num)  # this doesn't work
self.main.cyobj2.Cyfunc(num+1) # what I want to do
cdef CYTEST o = self.main.cyobj2
o.Cyfunc(num+1)