当前位置:  开发笔记 > 编程语言 > 正文

返回自己的自定义OrderedDict

如何解决《返回自己的自定义OrderedDict》经验,为你挑选了1个好方法。



1> Bi Rico..:

这里的关键是要意识到这self[k]是相同的,self.__getitem__(k)所以你不想在self[k]里面使用__getitem__,除非你实际上尝试做一些递归.而是总是使用OrderedDict.__getitem__ (self,key).

在一个不相关的注释中,您通常不希望创建一个只调用父类的相同方法的方法,即:

class MyArray (OrderedDict):
    def __init__ (self,*args):
        OrderedDict.__init__(self,*args)

只需删除方法,python就会为你调用父类方法,继承很棒:).

更新:

经过一番挖掘后,我发现当你尝试打印一个MyArray因为OrderedDict.__repr__调用OrderDict.items然后调用OrderDict.__getitem__(以形式self[key])时会得到无限递归,然后调用__repr__每个项目......这里的问题是你要修改__getitem__为与Parent类中的内容非常不同的东西.如果您希望此类具有python类的全部功能,则需要覆盖在方法中的self[key]任何位置使用的每个方法.你可以先开始items,比如:

def items(self):
    'od.items() -> list of (key, value) pairs in od'
    return [(key, OrderedDict.__getitem__(self, key)) for key in self]

当你遇到这种情况时,通常最好放弃子类并让OrderedDict成为新类的属性,例如:

class MyArray(object):

    def __init__(self, *args):
        self.data = OrderedDict(*args)

    def __getitem__(self, key):
        if not hasattr (key, '__iter__'):
            return MyArray([(key, self.data[key])])
        return MyArray([(k, self.data[k]) for k in key])

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有