在以下示例代码中,导入了一个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)
答案 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实例就永远不会释放内存。