<p>实现这一目标的方法不止一种——这里有一种方法。在</p>
<p>下面的代码定义了<code>ZMUMPS_COMPLEX</code>的包装器。然后它为<code>ZMUMPS_STRUC_C</code>定义一个包装器,并为<code>rhs</code>属性使用<code>__get__</code>和{<cd4>}方法,允许它接受<code>ZMUMPS_COMPLEX</code>包装。在</p>
<p><strong>zmumps_c.pyx</strong></p>
<pre><code>cdef class ZMUMPS_COMPLEX:
'''A wrapper for the ZMUMPS_COMPLEX struct'''
cdef c_ZMUMPS_COMPLEX c_zm
def __init__(self, double real, double imag=0):
self.c_zm.r = real
self.c_zm.i = imag
property r:
def __get__(self):
return self.c_zm.r
def __set__(self, value):
self.c_zm.r = value
property i:
def __get__(self):
return self.c_zm.i
def __set__(self, value):
self.c_zm.i = value
def __repr__(self):
return '({real}{imag:+}j)'.format(real=self.c_zm.r, imag=self.c_zm.i)
cdef class ZMUMPS_STRUC_C:
'''A wrapper for the ZMUMPS_STRUC_C struct'''
cdef c_ZMUMPS_STRUC_C ob
cdef object _rhs
property rhs:
def __get__(self):
return self._rhs
def __set__(self, ZMUMPS_COMPLEX c):
self._rhs = c
self.ob.rhs = &c.c_zm
def test(self):
return (self.ob.rhs[0].r, self.ob.rhs[0].i,)
def main():
z = ZMUMPS_STRUC_C()
c = ZMUMPS_COMPLEX(-3.5, 2.0)
z.rhs = c
print z.rhs
print z.test()
c.r = 42.0
print z.rhs
z.rhs.i = -5.0
print z.rhs
</code></pre>
<p><code>main()</code>函数演示了这两个对象的行为。输出应如下所示:</p>
^{pr2}$
<p>我没有安装库,所以我使用下面的虚拟定义进行了测试:</p>
<p><strong>zmumps_.pxd</strong></p>
<pre><code>cdef struct c_ZMUMPS_COMPLEX "ZMUMPS_COMPLEX":
double r
double i
cdef struct c_ZMUMPS_STRUC_C "ZMUMPS_STRUC_C":
c_ZMUMPS_COMPLEX *rhs
</code></pre>
<p><strong>设置.py</strong></p>
<pre><code>from distutils.core import setup
from Cython.Build import cythonize
setup(
ext_modules = cythonize("example.pyx")
)
</code></pre>