Rus*_*ltz 2 python subclass data-structures
这是我的一般问题空间:
我通过I2C拥有与设备的字节/位协议。
我有命令的“数据库”以完整描述所有位字段的类型,值和枚举。
我有一个使用数据库的类和一个i2c驱动程序/事务器,以便随后可以调用命令并获取响应。
MyProtocol = Protocol('database.xml',I2CDriver())
theStatus = MyProtocol.GET_STATUS()
Run Code Online (Sandbox Code Playgroud)
为GET_STATUS命令创建正确的字节流,通过i2c发送该字节流,并以字节数组的形式返回当前响应。我可以将其漂亮地打印在GET_STATUS()实现内部的响应中,但是我想将该行为移回对象,而不是在命令中。
我希望我的返回对象是“智能”的: theStatus需要具有字节列表/数组以及对其字段定义的引用。
我想像theStatus一个列表/字节数组,所以我可以直接检查字节。我不在乎切片是否是字节列表或字节数组以外的其他内容。一旦将它们切成片,它们就是字节。
我希望能够打印“ theStatus”,print(theStatus)并漂亮地打印状态中的所有字段。一旦确定了可行的数据结构,该结构允许我访问字节和数据库,我对如何实现此目标感到很满意。
我想theStatus用类似theStatus.FIELDNAME或的方式按字段名称检查theStatus['FIELDNAME']'。同样的事情:一旦我有了一个以字节数组和数据库为成员的可行数据结构,我就可以实现这一目标。
问题是我不知道导致问题最少的“正确”数据结构。
关于实现此目标的最Python方式的任何建议吗?我最初的想法是继承list定义并添加为成员,但似乎python根本不喜欢这种想法。
作文似乎是下一个赌注,但要使其表现得像人一样,list似乎可能需要付出很多努力才能使其“正确”。
您真正想要的是实现一种可能是可变的新序列类型。您可以通过实施仿真容器类型所需的特殊方法从头开始创建一个容器,也可以使用合适的collections.abc集合ABC作为基础。
后者可能是最简单的方法,因为ABC将许多方法的实现作为基本版本提供,这些基本版本依赖于必须实现的一些抽象方法。
例如,(不可变的)SequenceABC仅要求您提供__getitem__和的实现__len__。基本的ABC实施提供了其余的内容:
from collections.abc import Sequence
class StatusBytes(Sequence):
def __init__(self, statusbytes):
self._bytes = statusbytes
def __getitem__(self, idx_or_name):
try:
return self._bytes[idx_or_name]
except IndexError:
# assume it is a fieldname
return FIELDNAMES[idx_or_name]
def __len__(self):
return len(self._bytes)
Run Code Online (Sandbox Code Playgroud)
如果您确实需要完整的列表实现,包括对丰富的比较(list_a <= list_b),排序(list_a.sort()),复制[ list_a.copy()]和乘法(list_a * 3)的支持,那么也可以使用collections.UserList()类。此类继承自collections.abc.MutableSequence,并添加list了在基本序列ABC上提供的额外功能。如果你没有需要额外的功能,坚持基础的ABC。