Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建共享内存的pythonic对象_Python_C_Pointers - Fatal编程技术网

创建共享内存的pythonic对象

创建共享内存的pythonic对象,python,c,pointers,Python,C,Pointers,我试图在python中创建一个由较小对象组成的对象。每个对象都有自己的含义——每个较小的对象和整个对象都是一个整体。 问题是,我希望这3个对象中的每一个看起来都是独立可寻址的,并且作为独立对象运行,这是很难实现的。 在C中使用指针很容易解决这个问题,但我发现在Python中很难模拟这种行为 my_obj1 = Object1() my_obj2 = Object2() my_parent_obj = Object3() my_parent_obj.obj1 = my_obj1 my_parent

我试图在python中创建一个由较小对象组成的对象。每个对象都有自己的含义——每个较小的对象和整个对象都是一个整体。 问题是,我希望这3个对象中的每一个看起来都是独立可寻址的,并且作为独立对象运行,这是很难实现的。 在C中使用指针很容易解决这个问题,但我发现在Python中很难模拟这种行为

my_obj1 = Object1()
my_obj2 = Object2()
my_parent_obj = Object3()
my_parent_obj.obj1 = my_obj1
my_parent_obj.obj2 = my_obj2
我所说的情况的一个例子可以在状态机的控制字中看到:控制字(2个字节)作为一个整体具有意义,需要作为一个对象进行访问(或传输),但控制字中的每个字节都有自己的意义,需要单独设置和访问

在C语言中,我会做如下操作:

unsigned short control_word_memory;
unsigned short *control_word = &control_word_memory;
unsigned char *low_byte = &control_word_memory;
unsigned char *high_byte = low_byte + 1;
因此,我能够轻松地访问每个元素,而不必被迫维护复杂的逻辑来保持所有3个对象的同步-分配到
*control\u word
将同时更新
低字节
高字节
,对字节对象的任何更新都会影响
控制\u字


有没有一种简单的方法可以在Python中实现这种行为?

如果我理解正确,在Python中实现这种行为非常容易

my_obj1 = Object1()
my_obj2 = Object2()
my_parent_obj = Object3()
my_parent_obj.obj1 = my_obj1
my_parent_obj.obj2 = my_obj2

现在,object1和object2实例既可以作为
my_obj1
独立寻址,也可以作为父对象的一部分作为
my_parent_obj.obj1
寻址。对其中一个所做的任何更改都会影响另一个。

如果我理解正确,这在Python中非常容易实现

my_obj1 = Object1()
my_obj2 = Object2()
my_parent_obj = Object3()
my_parent_obj.obj1 = my_obj1
my_parent_obj.obj2 = my_obj2
现在,object1和object2实例既可以作为
my_obj1
独立寻址,也可以作为父对象的一部分作为
my_parent_obj.obj1
寻址。对其中一个的任何更改都会影响另一个。

有两种选择:

您可以使用C和CPython包装器。。。或者,您可以使用属性:

class Control(object):
        def __init__(self, word=0):
                self.word = word
        def get_low(self):
                return self.word & 0xFF
        def set_low(self, x):
                self.word &= 0xFF00
                self.word |= x & 0xFF
        def get_high(self):
                return (self.word >> 8) & 0xFF
        def set_high(self, x):
                self.word &= 0x00FF
                self.word |= (x & 0xFF) << 8
        low = property(get_low, set_low)
        high = property(get_high, set_high)
鉴于评论的进一步解释:

我希望能做一些类似的事情
c=Control();
设备控制=dict(设备控制=c.word,设备读取权限
=c.low,device\u write\u permissions=c.high)
然后通过目录访问每个组件

您根本不需要字典,您可以使我们的
控件
类的行为类似于实现的字典(它有很多方法,如果您愿意,您可以省去不使用的方法):

然后像这样使用它:

In [2]: c = DictControl()

In [3]: c.word = 0x1234

In [4]: hex(c['device_control'])
Out[4]: '0x1234'

In [5]: c['device_read_permissions'] = 0xFF

In [6]: c.low
Out[6]: 255

In [7]: c.high = 0xAA

In [8]: c['device_write_permissions']
Out[8]: 170

In [9]: hex(c.word)
Out[9]: '0xaaff'
两个备选方案:

您可以使用C和CPython包装器。。。或者,您可以使用属性:

class Control(object):
        def __init__(self, word=0):
                self.word = word
        def get_low(self):
                return self.word & 0xFF
        def set_low(self, x):
                self.word &= 0xFF00
                self.word |= x & 0xFF
        def get_high(self):
                return (self.word >> 8) & 0xFF
        def set_high(self, x):
                self.word &= 0x00FF
                self.word |= (x & 0xFF) << 8
        low = property(get_low, set_low)
        high = property(get_high, set_high)
鉴于评论的进一步解释:

我希望能做一些类似的事情
c=Control();
设备控制=dict(设备控制=c.word,设备读取权限
=c.low,device\u write\u permissions=c.high)
然后通过目录访问每个组件

您根本不需要字典,您可以使我们的
控件
类的行为类似于实现的字典(它有很多方法,如果您愿意,您可以省去不使用的方法):

然后像这样使用它:

In [2]: c = DictControl()

In [3]: c.word = 0x1234

In [4]: hex(c['device_control'])
Out[4]: '0x1234'

In [5]: c['device_read_permissions'] = 0xFF

In [6]: c.low
Out[6]: 255

In [7]: c.high = 0xAA

In [8]: c['device_write_permissions']
Out[8]: 170

In [9]: hex(c.word)
Out[9]: '0xaaff'

要访问零件并提取对象,应创建一些“零件对象”

类零件(对象):
定义初始化(self、ref、bitstart、bitlen):
self.ref=ref
self.bitstart=bitstart
self.bitlen=bitlen

self.mask=((1要访问零件并提取对象,您应该创建一些“零件对象”

类零件(对象):
定义初始化(self、ref、bitstart、bitlen):
self.ref=ref
self.bitstart=bitstart
self.bitlen=bitlen

self.mask=((1)这里的问题是,父对象在内存中不是连续的,并且此解决方案没有真正模拟我给出的示例。它不适用于整数,除非重载父对象的赋值运算符以在子对象之间拆分输入,并在尝试检索要连接的值时解决一些问题两个子对象再次合并为一个子对象…我更新了我的问题以强调这一点。也许您正在查找
属性
()?这里的问题是,父对象在内存中不是连续的,并且此解决方案没有真正模拟我的给定示例。如果不重载父对象的赋值运算符以拆分子对象之间的输入,并且在尝试检索连接t的值时解决某个问题,则它将不适用于整数他将两个子对象再次合并为一个…我更新了我的问题以强调这一点。也许您正在寻找
属性
()?这看起来很不错,但是我可以将
作为独立对象提取出来吗?也就是从类中提取出来吗?还是我应该从类中重新创建属性,给属性函数提供绑定方法?你的意思是通过引用传递它们,以便其他人可以在不引用属性的情况下更新它们整个
Control
object?恐怕不行,除非你把它们包装成另一个可变的对象。这对我来说是个问题……我想做一些类似
c=Control();device\u Control=dict(device\u Control=c.word,device\u read\u permissions=c.low,device\u write\u permissions=c.high)的事情
然后通过dict访问每个组件…@personal:这在任何情况下都需要可变整数,并且无法工作(postably)使用GC的簿记和当前的对象布局。此外,除非你彻底改变Python的语义或避免简单赋值,否则你需要字典的合作。简言之,这是不可能的。不要试图像用C一样用Python编程。告诉我们你实际上在做什么。@delnan我已经告诉过你了我想要。我有几个“字”,每个字都被命名,每个字的每个字节都被命名