如何继承的OrderedDict?(How to subclass an OrderedDict?)

2019-07-30 02:57发布

子类化一个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继承?

Answer 1:

您需要调用OrderedDict.__init____init__

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

你没有给OrderedDict机会初始化本身。 从技术上讲,你要为你做这个dict子类为好,因为你想要一个完全初始化的dict 。 这一事实dict工作没有它仅仅是运气。



Answer 2:

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

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

这是初始化一个子类的正常方式。 你不必调用父类的__init__方法一般,但如果你有没有超类的实现的知识,你真的应该叫__init__



文章来源: How to subclass an OrderedDict?