29

子类化 Pythondict按预期工作:

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

但是,用 a 做同样的事情是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 继承?

4

2 回答 2

36

您需要OrderedDict.__init__从您的调用__init__

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

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

于 2012-06-24T03:19:33.083 回答
2

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

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

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

于 2012-06-24T03:19:22.203 回答