Как подклассировать OrderedDict?

Подкласс Python dict работает, как и ожидалось:

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

Тем не менее, делать то же самое с collections.OrderedDict Не работаетrderedDict:

>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
...     def __init__(self):
...         self[1] = 10
...         
>>> OrdDictSub()
(…)
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root'

Таким образом, реализация OrderedDict использует частный __root __root, который препятствует тому, чтобы подкласс OrdDictSub вел себя как подкласс DictSub. Зачем? Как можно наследовать от OrderedDict?

Ответ 1

Вам нужно вызвать OrderedDict.__init__ из вашего __init__:

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

Вы не дали OrderedDict возможность инициализировать себя. Технически вы хотите сделать это для своего подкласса dict, так как вы хотите полностью инициализированный dict. Тот факт, что dict работает без него, - это просто удача.

Ответ 2

Попробуйте инициализировать суперкласс в методе __init__:

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

Это обычный способ инициализации подкласса. Вам не нужно вызывать метод суперкласса __init__ в целом, но если вы не знаете о реализации суперкласса, вам действительно следует называть __init__.