gpt4 book ai didi

python - 创建共享内存的 pythonic 对象

转载 作者:太空宇宙 更新时间:2023-11-04 01:39:37 24 4
gpt4 key购买 nike

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

我正在谈论的情况的一个例子可以在状态机的控制字中看到:控制字(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_word 的赋值会更新两个 low_bytehigh_byte 同时进行,字节对象的任何更新都会影响control_word

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

最佳答案

两种选择:

您可以使用 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)

现在您可以将其用作:

In [3]: c = Control(0x1234)

In [4]: hex(c.low)
Out[4]: '0x34'

In [5]: hex(c.high)
Out[5]: '0x12'

In [6]: c.low=56

In [7]: hex(c.word)
Out[7]: '0x1238'

In [8]: c.low=0x56

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

In [10]: c.high = 0x78

In [11]: hex(c.word)
Out[11]: '0x7856'

In [12]: c.word = 0xFE0A

In [13]: c.low
Out[13]: 10

In [14]: c.high
Out[14]: 254

根据评论的进一步解释:

I'd want to be able to do something like c = Control();
device_control = dict(device_control = c.word, device_read_permissions
= c.low, device_write_permissions = c.high)
and then access each component through the dict...

你根本不需要字典,你可以让我们的 Control 类表现得像一个实现了 dict protocol 的字典。 (方法比较多,不用的可以省略):

class DictControl(Control):
def __len__(self):
return 3
def __getitem__(self, k):
if k == 'device_control':
return self.word
elif k == 'device_read_permissions':
return self.low
elif k == 'device_write_permissions':
return self.high
else: raise KeyError
def __setitem__(self, k, v):
if k == 'device_control':
self.word = v
elif k == 'device_read_permissions':
self.low = v
elif k == 'device_write_permissions':
self.high = v
else: raise KeyError

然后像这样使用它:

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'

关于python - 创建共享内存的 pythonic 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8182714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com