Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
Python 当作为iterable访问时指向属性的对象_Python_Class_Iteration - Fatal编程技术网

Python 当作为iterable访问时指向属性的对象

Python 当作为iterable访问时指向属性的对象,python,class,iteration,Python,Class,Iteration,我试图弄清楚,当一个类被“用作”字典时,是否有一种优雅而简洁的方式让它访问自己的一个属性,基本上是将在有序字典中实现的所有方法重定向到它的一个属性 目前我继承了iterablueserdict,并显式地将其数据设置为另一个属性,它似乎在工作,但我知道UserDict被认为有点过时,我担心我可能忽略了一些东西 我所拥有的: class ConnectionInterface(IterableUserDict): def __init__(self, hostObject):

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

目前我继承了iterablueserdict,并显式地将其数据设置为另一个属性,它似乎在工作,但我知道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中这样做,则查找某些内容,等等

欢迎任何建议,上面的建议似乎很有效,但我有一种奇怪的渴望,我可能错过了一些东西


提前谢谢。

当然,你可以这样做。字典的主要功能是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()

最终,继承iterablueserdict并将self.data显式设置为我所需要的,并且在序列化和反序列化时没有产生任何不可预见的后果或增加危险性

坚持我的原始解决方案,我想,如果任何人需要对自己对象中选定的数据子集进行简单而全面的dict行为,我可以推荐它


它相当简单,没有特别严格的可伸缩性或复杂性要求。

在我的具体案例中,除了获取和设置适合类属性但不适合整个类的属性之外,字典中还有许多方便的方法,我喜欢这些方法。在set、get、by key、by value、sorting popping等属性之间,所有应用于该属性的东西,都会变成太多的样板文件,无法实现零碎。不过,我对不可预见的后果保持警惕,例如可能会破坏副本、序列化等。这可能只会产生属性,而不是正确地跨越整个对象,但测试所有潜在用途将花费我太长的时间。