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

w00*_*00d 14 c python binding class cython

我有一个现有的python类X,我想做以下事情:

from my_python_module import X
cdef class Y:
    cdef X test
Run Code Online (Sandbox Code Playgroud)

但这不是开箱即用的,cdef只接受C类型,而不是Python类.任何解决方法?

lbo*_*lla 16

我认为你不能(http://docs.cython.org/src/userguide/sharing_declarations.html#sharing-extension-types)但你可以使用__cinit__断言该属性具有正确的类型:

在您的Cython文件中(例如,名为"p.pyx"):

import my_python_module as q

cdef class Y:
    cdef int i
    cdef public object x  # public so it can be accessed from Python

    def __cinit__(self, x_):
        assert isinstance(x_, q.X)
        self.x = x_
Run Code Online (Sandbox Code Playgroud)

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

class X(object):
    def __init__(self):
        self.i = 1
Run Code Online (Sandbox Code Playgroud)

然后,你像这样使用它:

import my_python_module as q
import p

y = p.Y(q.X())
print y.x
print y.x.i
Run Code Online (Sandbox Code Playgroud)