我想在Cython中创建一个在Python中可读的类。目前,我的代码看起来像下面的代码(当然它们并不完全相同,但是代码的结构和组织是相同的。)
据我了解,我们无法直接从Python调用Cython对象,因此我打算使 TEST
类作为包装器工作,从而可以调用更快的Cython类。
但是,我发现(我原来的问题中的这一段被证明是错误的).pyx
中的类对象无法在同一文件中的Cythonized类中调用cdef
函数,因此cdef class CYTEST
有另一个包装函数def func()
,对于我。
我发现我们可以在int
文件中声明对象(例如list
,object
和.pxd
),并且可以从以下位置读取Cython类中的对象:在.pyx
文件中定义的Python类(在下面的示例中,print(self.cytest.somenum)
)。
我们可以对Cythonized类做类似的事情吗?在示例中,我们可以直接在Cyfunc()
类中调用TEST
吗?
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没有针对我的案例的示例。
答案 0 :(得分:1)
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 class
,然后指定cyobj1
和cyobj2
以及CYTEST.main
的类型。但是,这可能会导致循环依赖问题,因此我不确定这是否可能。