关于python:如何将ordereddict子类化?

How to subclass an OrderedDict?

python dict的子类化按预期工作:

1
2
3
4
5
6
>>> class DictSub(dict):
...     def __init__(self):
...         self[1] = 10
...        
>>> DictSub()
{1: 10}

但是,对collections.OrderedDict执行相同的操作不起作用:

1
2
3
4
5
6
7
8
>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
...     def __init__(self):
...         self[1] = 10
...        
>>> OrdDictSub()
()
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root'

因此,ordereddict的实现使用一个私有的__root属性,它防止子类OrdDictSub的行为类似于DictSub子类。为什么?一个人如何能从有序的信息技术中继承?


你需要从你的__init__中调用OrderedDict.__init__

1
2
3
class OrdDictSub(collections.OrderedDict):
    def __init__(self):
        super(OrdDictSub, self).__init__()

您没有给OrderedDict一个初始化自身的机会。从技术上讲,您也希望为您的dict子类执行此操作,因为您需要一个完全初始化的dict。事实上,没有它,dict就可以工作,这只是运气。


尝试在__init__方法中初始化超类:

1
2
3
def __init__(self):
    collections.OrderedDict.__init__(self)
    self[1] = 10

这是初始化子类的正常方法。一般来说,您不必调用超类的__init__方法,但是如果您不知道超类的实现,那么您真的应该调用__init__