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

标签 python inheritance cython

在以下示例代码中,导入了 cython 类 (Q)。创建 Q 的两个实例(q1q2)。我想更改 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/

相关文章:

具有继承性的 Python 循环导入

java - 使用@Inheritance JPA属性时插入顺序无效

python - 使用 Pyinstaller 或 Cython 从 Python 模块创建可执行文件

python - Python 中向量的高性能全面比较

c++ - 防止兄弟结构的平等比较

multithreading - 在 cython 中拥有线程本地数组以便我可以调整它们的大小?

python - 深度学习模型预测关键词点击次数

Python,需要帮助使用 mechanize 制作 'brute force'

python - 如何将现有的 MySQL 数据库导入到 web2py 中?

python - 在 Amazon 的 DynamoDB 中编写分布式队列