当作为可迭代访问时,对象指向属性

时间:2012-10-09 03:34:41

标签: python class iteration

我正在试图弄清楚是否有一种优雅而简洁的方法让一个类在“使用”作为字典时访问其自己的属性之一,基本上将所有在有序字典中实现的方法重定向到其中一个属性。

目前我从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中查找了一些内容,依此类推。

欢迎任何建议,以上似乎工作正常,但我有一个奇怪的痒,我可能会遗漏一些东西。

提前致谢。

2 个答案:

答案 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()