如何在python中实现C/C++全局变量?

Siv*_*eti 2 python swig

当我通过SWIG文档阅读时,我通过这些线路来了..

SWIG完全支持C/C++全局变量.但是,由于Python分配的工作方式,底层机制与您预期的有些不同.当您在Python中键入以下内容时
a = 3.4
"a"将成为包含值3.4的对象的名称.如果稍后键入
b = a,
则"a"和"b"都是包含值3.4的对象的名称.因此,只有一个对象包含3.4,"a"和"b"都是引用它的名称.这与C完全不同,其中变量名称是指存储值的存储位置(并且赋值将数据复制到该位置).因此,没有直接的方法将C中的变量赋值映射到Python中的变量赋值.
为了提供对C全局变量的访问,SWIG创建了一个名为`cvar'的特殊对象,该对象被添加到每个SWIG生成的模块中.然后,全局变量作为此对象的属性进行访问.

我的问题是以上述方式实施的必要性.即使我们以上述方式实现,对象属性也被实现为对象.

请参阅下面的python代码片段

a = 10  
b = a  
a is b  
True  

class sample: 
    pass   

obj = sample()  
obj.a = 10  
obj.b = obj.a  
obj.a is obj.b  
True  
Run Code Online (Sandbox Code Playgroud)

在上述两种情况下,对象分配以相同的方式发生

Bak*_*riu 5

这完全是因为SWIG必须为C/C++中的库提供一个不同的行为接口.

让我们假设不是实现一个cvar对象,而是简单地使用PyInts等作为生成模块的属性(这是"普通"C扩展所做的).然后,当从Python代码,用户的值赋给变量一个新的 PyInt对象被分配到属性,但库所使用的原始变量保持不变,因为模块对象也不会知道它有修改C-全球做任务时变量.

这意味着,虽然从python端用户将看到值更改,但C库将不会意识到更改,因为全局变量表示的内存位置未更改其值.

为了允许用户以从C/C +库中可见的方式设置值,SWIG必须定义此cvar对象,在执行赋值时,将值分配给封面下的库变量,即它更改包含全局变量值的内存位置的内容.

这可能是提供__setattr____getattr__或的实现__getattribute__,因此cvar能够覆盖赋值给属性的行为.