这里的关键是要意识到这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])