Cython:如何将python对象作为Cython类的属性

Cython:如何将python对象作为Cython类的属性,python,c,class,binding,cython,Python,C,Class,Binding,Cython,我有一个现有的python类X,我想做以下工作: from my_python_module import X cdef class Y: cdef X test 但这不是现成的,cdef只接受C类型,而不是Python类。有什么解决方法吗?我不认为您可以()但是您可以使用\uuuu cinit\uuuu来解决它,以断言属性具有正确的类型。扩展类型属性的声明cdef public object x具有以下含义: 使用了cdef public使 对象是属性的类型,并且 x是属性的标识符

我有一个现有的python类
X
,我想做以下工作:

from my_python_module import X
cdef class Y:
    cdef X test
但这不是现成的,cdef只接受C类型,而不是Python类。有什么解决方法吗?

我不认为您可以()但是您可以使用
\uuuu cinit\uuuu
来解决它,以断言属性具有正确的类型。扩展类型属性的声明
cdef public object x
具有以下含义:

  • 使用了
    cdef
  • public
    使
  • 对象
    是属性的类型,并且
  • x
    是属性的标识符
在Cython文件(例如名为“p.pyx”)中:

my_python_module.py
就是您定义类X的地方:

class X(object):
    def __init__(self):
        self.i = 1
然后,您可以这样使用它:

import my_python_module as q
import p

y = p.Y(q.X())
print y.x
print y.x.i
cdef class SomeCls:
    cdef object _x

    def __cinit__(self, x_):
        self._x = x_

    property x:
        def __get__(self):
            return self._x
        def __set__(self, x_):
            self._x = x_

另外,请注意,
cpdef
意味着与
cython==0.29.22
cdef
相同,并且在
cython==3
中不受支持(如果属性是用
cpdef
声明的,请参见)。

我将使用类似的方法:

import my_python_module as q
import p

y = p.Y(q.X())
print y.x
print y.x.i
cdef class SomeCls:
    cdef object _x

    def __cinit__(self, x_):
        self._x = x_

    property x:
        def __get__(self):
            return self._x
        def __set__(self, x_):
            self._x = x_
当公开外部结构或类的属性时,上述内容特别有用。请参阅此处的示例:

nice,所以
object
可以用来分配任何python对象?@w00d:没错()。