Как создать подкласс OrderedDict?

Подклассы Pythondict работает как положено:

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

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

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

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

 Eric O Lebigot24 июн. 2012 г., 05:30
Почему отрицательный голос?

Ответы на вопрос(2)

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

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

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

 27 июн. 2014 г., 17:55
@EOL: я могу принять этоsuper() это путь, но я не согласен с вашим "более того": я бы сказал, что это шесть из полутора десятков других,in Python 2, Если вы хотите изменить имя вашегоOrdDictSub класс, но по-прежнему оставляют того же родителя, а затемsuper() означает, что вы должны сделать это в двух местах, а не в одном. С другой стороны, если вы хотите сохранитьOrdDictSub имя, но изменить родителя, тоnot с помощьюsuper() означает, что вы должны сделать это в двух местах, а не в одном. К счастью, это было исправлено в Python 3 (просто позвонитеsuper() без параметров).
 24 июн. 2012 г., 05:24
использованиеsuper() вызывать методы суперкласса
 24 июн. 2012 г., 05:25
@astynax: оба способа работают, так что это вопрос стиля.
 08 нояб. 2014 г., 10:20
@JohnY: это отличный ответ Мартин Питерс охватывает это:stackoverflow.com/a/18208725/82294 - если ты думаешь, что Мартейн не прав, иди спорь там.
 Eric O Lebigot24 июн. 2012 г., 05:29
@DietrichEpp: хороший ответ, но с использованиемsuper() это не вопрос стиля: важно использовать его (вместо использования явного суперкласса) в случае, если ваш собственный класс находится в подклассе. Пример справки:rhettinger.wordpress.com/2011/05/26/super-considered-super, Кроме того, используяsuper() упрощает поддержку кода (проще изменить имя класса).
Решение Вопроса

Вы должны призватьOrderedDict.__init__ от твоего__init__:

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

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

 Eric O Lebigot24 июн. 2012 г., 05:28
Благодарю. Мой плохой, действительно. Это правда, что на меня повлиял диктат. Я даже задал вопрос про dict некоторое время назад (stackoverflow.com/questions/2033150/…)!
 10 февр. 2013 г., 07:00
Разве вы не хотите args и kwargs в init?def __init__(self, *args, **kwargs): super(OrdDictSub, self).__init__(*args, **kwargs)

Ваш ответ на вопрос