Подклассы работает питон словарь
, как ожидалось:
>>> 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?
Вам нужно вызвать OrderedDict.метод initот
init, которая`:
class OrdDictSub(collections.OrderedDict):
def __init__(self):
super(OrdDictSub, self).__init__()
Вы еще'т получить OrderedDictвозможность инициализировать себя. Технически, вы хотите сделать это для
диктподкласс также, так как вы хотите полностью инициализирован
словарь. Тот факт, что
дикт` без него просто повезло.
Попробовать инициализации суперкласса в метод __init__
:
def __init__(self):
collections.OrderedDict.__init__(self)
self[1] = 10
Это нормальный путь для инициализации подкласса. Вы Don'Т У для вызова суперкласса'ы __init__, которая метод в целом, но если у вас нет знаний суперкласса'ы реализации, вы действительно должны позвонить__init и__
.