【发布时间】:2018-10-17 00:43:43
【问题描述】:
我想在 Cython 中创建一个在 Python 中可读的类。目前,我的代码如下所示(当然它们并不完全相同,但代码的结构和组织是相同的)。
据我了解,我们不能直接从 Python 调用 Cython 对象,所以我打算让 TEST 类作为包装器工作,它可以调用更快的 Cython 类。
但是,我发现(我原来的问题中的这一段原来是错误的).pyx 中的类对象无法在同一个文件中调用 Cythonized 类中的cdef 函数,因此cdef class CYTEST 有另一个包装函数def func(),这对我来说看起来效率低下。
我发现我们可以在.pxd文件中声明对象(例如int、list和object),我们可以从.pyx文件中定义的Python类中读取Cython类中的对象(在下面的示例中,print(self.cytest.somenum))。
我们可以用 Cythonized 类做类似的事情吗?例子中,可以直接在TEST类中调用Cyfunc()吗?
main.py的一部分:
class MAIN:
def __init__(self):
cyobj1 = cyobj.CYTEST(self)
cyobj2 = cyobj.CYTEST(self)
cyobj1.func(3)
在cyobj.pyx
cdef class CYTEST:
cdef object main
cdef int somenum
def __cinit__(self, object main):
self.main = main
self.somenum = 5
def func(self, int num):
return self.Cyfunc(num)
cdef void Cyfunc(self, int num):
print(num)
self.main.cyobj2.Cyfunc(num+1) # what I want to do
cyobj.pxd:
cdef class CYTEST:
cdef public object main
cdef public int somenum
cdef public void Cyfunc(self, int num) # this doesn't work
Official document 没有我的例子。
【问题讨论】:
-
不确定您想要实现什么。您是否尝试在 python 中调用
CYTEST(MAIN())?只有`cdef-functions/methods cannot be called from python -cdef class`是另一回事。 -
@ead 哦,它有效!那么,我们可以从另一个
cdef class调用cdef class中的cdef函数吗?在我的例子中,我想打电话给self.main.cyobj2.Cyfunc(num+1)。
标签: python python-3.x cython