在以下示例代码中,导入了 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)
最佳答案
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 的实例,您就永远不会释放内存。
关于python - Cython 中的继承(简短的示例代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441407/