我正在试图弄清楚是否有一种优雅而简洁的方法让一个类在“使用”作为字典时访问其自己的属性之一,基本上将所有在有序字典中实现的方法重定向到其中一个属性。
目前我从IterableUserDict继承并明确地将其数据设置为另一个属性,它似乎正在工作,但我知道UserDict被认为是旧的,我担心我可能会忽视某些东西。
我有什么:
class ConnectionInterface(IterableUserDict):
def __init__(self, hostObject):
self._hostObject= hostObject
self.ports= odict.OrderedDict()
self.inputPorts= odict.OrderedDict()
self.outputPorts= odict.OrderedDict()
self.data= self.ports
这样我希望对象能够按照我的意思行事和响应(并被使用),除非我想在其属性“ports”上获得一个免费的有序字典行为,当它被迭代时,项目是通过密钥得到的,如果在myObject中查找了一些内容,依此类推。
欢迎任何建议,以上似乎工作正常,但我有一个奇怪的痒,我可能会遗漏一些东西。
提前致谢。
答案 0 :(得分:1)
最后继承IterableUserDict并设置self.data明确地解决了我需要的事情,并且在序列化和反序列化时没有任何不可预见的后果或增加了狡猾。
如果有人需要一个简单而完整的dict,比如他们自己对象中所选数据子集的行为,那么我猜测它可以推荐给我原来的解决方案。
它非常简单,并没有特别严格的可扩展性或复杂性要求,但却强调它。
答案 1 :(得分:0)
当然,你可以这样做。字典的主要内容是getattr和setattr方法,因此您可以实现这样的魔术方法__getattr__
和__setattr__
:
def __getattr__(self, key):
return self.ports[key]
def __setattr__(self, key, value):
self.ports[key] = value
如果你想要实现.keys()和.values()和东西,只需用这种方式编写它们:
def keys(self):
return self.ports.keys()