Как подклассировать 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__
.