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

2024-04-20 04:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个现有的python类X,我想执行以下操作:

from my_python_module import X
cdef class Y:
    cdef X test

但这并不是开箱即用的,cdef只接受C类型,而不接受Python类。有什么办法吗?在


Tags: fromtestimport类型myclassmodule开箱
2条回答

我会用这样的方法:

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_

当暴露外部结构或类的属性时,上面的方法特别有用。请参考以下示例: wrapping C++

我不认为您可以(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_

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

^{pr2}$

然后,你就这样使用它:

import my_python_module as q
import p

y = p.Y(q.X())
print y.x
print y.x.i

相关问题 更多 >