Как подкласс OrderedDict?

Подклассы работает питон словарь, как ожидалось:

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

Тем не менее, делает то же самое с коллекции.OrderedDict не работает:

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

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

Комментарии к вопросу (1)
Решение

Вам нужно вызвать OrderedDict.метод initотinit, которая`:

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

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

Комментарии (2)

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

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

Это нормальный путь для инициализации подкласса. Вы Don'Т У для вызова суперкласса'ы __init__, которая метод в целом, но если у вас нет знаний суперкласса'ы реализации, вы действительно должны позвонить__init и__.

Комментарии (10)