Моя первая попытка объединить функции двух словарей в модуле collections
заключалась в создании класса, который их наследует:
from collections import OrderedDict, defaultdict
class DefaultOrderedDict(defaultdict, OrderedDict):
def __init__(self, default_factory=None, *a, **kw):
super().__init__(default_factory, *a, **kw)
Однако я не могу назначить элемент этому словарю:
d = DefaultOrderedDict(lambda: 0)
d['a'] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python3.3/collections/__init__.py", line 64, in __setitem__
self.__map[key] = link = Link()
AttributeError: 'DefaultOrderedDict' object has no attribute '_OrderedDict__map'
В самом деле, этот вопрос о том, как создать подобный объект, имеет ответы, которые достигают его, расширяя класс OrderedDict
и вручную переуступая дополнительные методы defaultdict
. Использование множественного наследования будет более чистым. Почему это не работает?