旧代码使用两个全局变量,如下所示:
# global variables
cdef uint64_t g_num = 0
car_type = None
我怎样才能设计一个结构,它可以同时包含g\u num和car\u type? 以下是psudo代码:
class Car(object):
def __init__(self):
car_type = None
g_num ??? how to define it as an uint64_t?
cdef class Car:
uint64_t g_num
car_type ?? what is the type here?
基本上,我需要将组合类型放入dict中,以便使用以下代码:
d = {}
d['aaa'] = Car()
d['aaa'].g_num = 1
d['aaa'].car_type = 'Compact'
可能最简单的方法是将Cython类定义为:
幕后Cython创建属性(因此需要
public
)g_num
和car_type
。它负责初始化g_num
到0
和car_type
到None
。当调用__del__
时,Cython还负责减少绑定到car_type
的对象的引用计数。你知道吗现在我们希望它能正常工作:
python对象(
object
)和c成员(例如int
、long long int
等等)的属性之间存在细微的差别:在第一种情况下,我们获得对python对象的引用并可以对其进行更改。例如:
在第二种情况下,cython将创建一个新的python对象,更改它不会更改为其调用属性的对象的原始成员。你知道吗
在这个简单的例子中,这并不意外,因为“long long int”将作为一个不可变的python整数返回,但我们可以使用一个struct来说明这一点:
为了支持我的声明,
g_num
和car_type
被初始化(这并不明显)。重要的事情发生在这里:可以直接看到,行中的
car_type
被设置为None
不太明显的是} 时,因为在其过程中,内存(以及
g_num
如何设置为0
。它发生在调用PyTypeObject
的^{g_num
)是用0
初始化的。你知道吗car_type
的引用通过Py_CLEAR(p->car_type)
在__pyx_tp_dealloc_4test_Car
中减少:相关问题 更多 >
编程相关推荐