Cython中的继承(简短示例代码)

时间:2014-06-26 22:45:22

标签: python inheritance cython

在以下示例代码中,导入了一个cython类( Q )。创建了两个Q实例( q1 q2 )。我想改变q1中的变量并让它影响q2中的同一个变量。

非常感谢您在Cython中的时间和有关范围或继承的任何相关信息!

tc1.pyx:

cimport cython

cdef class Q:
    cdef public double q

    def __cinit__(self):
        self.q = 0

    def addone(self):
        self.q += 1

    property gsd:  # get set return
        def __get__(self):
            return self.q
        def __set__(self, value):
            pass
        def __del__(self):
            pass

.py文件:

from tc1 import Q

if __name__ == "__main__":
    q1 = Q()
    q2 = Q()

    print 'q1: ', q1.gsd, 'q2: ', q2.gsd  # >> 0 and 0

    q1.addone()

    print 'q1: ', q1.gsd, 'q2: ', q2.gsd  # >> 1 and 0 (1 and 1 desired)

2 个答案:

答案 0 :(得分:1)

我不确定你是如何在Cython中做到的,但这是一次尝试在常规Python中解决它。我假设如果你改变使用Cython装饰器的自然代码它应该可以正常工作。

首先你需要class variable,例如_bar,然后我们调整属性getter和setter方法来改变它,而不是实例变量。下面的代码应说明这一点,您可以verify it works on IdeOne

class Foo(object):
    _bar = 0

    @property
    def bar(self):
        return Foo._bar

    @bar.setter
    def bar(self, value):
       Foo._bar = value

    @bar.deleter
    def bar(self):
        pass

a = Foo()
b = Foo()

print a.bar
print b.bar

a.bar += 1

print a.bar
print b.bar

根据需要输出以下内容:

0
0
1
1

答案 1 :(得分:1)

Cython类编译为C,其中类成员只是结构中的值;所以cdef类没有静态变量的概念。

您可以简单地声明Q引用的全局指针,但是:

cimport cython
from libc.stdlib cimport malloc, free

cdef public double* global_q = <double*>malloc(sizeof(double))
global_q[0] = 0
def call_at_end():
    free(global_q)

cdef class Q:
    cdef double* q

    def __cinit__(self):
        self.q = global_q

    def addone(self):
        self.q[0] += 1

    property gsd:
        def __get__(self):
            return self.q[0]
        def __set__(self, double value):
            self.q[0] = value

现在您的主要功能将按预期工作。我添加了函数call_at_end以释放内存只是为了显示你将如何做,但在这种情况下,只要你可以创建一个Q实例就永远不会释放内存。