如何子类化OrderedDict?

时间:2012-06-24 03:16:57

标签: python inheritance subclass ordereddictionary

对Python dict进行子类化按预期工作:

>>> class DictSub(dict):
...     def __init__(self):
...         self[1] = 10
...         
>>> DictSub()
{1: 10}

然而,使用collections.OrderedDict执行相同的操作不起作用:

>>> 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子类。为什么?如何从OrderedDict继承?

2 个答案:

答案 0 :(得分:34)

您需要从OrderedDict.__init__

中调用__init__
class OrdDictSub(collections.OrderedDict):
    def __init__(self):
        super(OrdDictSub, self).__init__()

您尚未给OrderedDict初始化自己的机会。从技术上讲,您也希望为dict子类执行此操作,因为您需要完全初始化dictdict在没有它的情况下工作的事实只是运气。

答案 1 :(得分:2)

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

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

这是初始化子类的常规方法。你通常不会拥有来调用超类的__init__方法,但如果你不了解超类的实现,你真的应该调用__init__