Почему OrderedDict не использует super?
Мы можем создатьOrderedCounter
тривиально с использованием множественного наследования:
>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict):
... pass
...
>>> OrderedCounter('Mississippi').items()
[('M', 1), ('i', 4), ('s', 4), ('p', 2)]
Поправьте меня, если я ошибаюсь, но это в значительной степени зависит от того, чтоCounter
использованияsuper
:
class Counter(dict):
def __init__(*args, **kwds):
...
super(Counter, self).__init__()
...
То есть магический трюк работает, потому что
>>> OrderedCounter.__mro__
(__main__.OrderedCounter,
collections.Counter,
collections.OrderedDict,
dict,
object)
super
Вызов должен делегировать в соответствии с «братьев и сестер, прежде чем правило родителейMROоткуда пользовательский класс используетOrderedDict
в качестве хранилища данных.
Однако недавно мой коллега, к моему удивлению, отметил, чтоOrderedDict
не использовать супер:
def __setitem__(self, key, value,
dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link):
...
# <some weird stuff to maintain the ordering here>
dict_setitem(self, key, value)
Сначала я думал, что это может быть потому, чтоOrderedDict
пришел первым, и Раймонд не удосужился изменить его позже, но кажется, чтоsuper
предшествующиеOrderedDict
.
ПочемуOrderedDict
вызовdict.__setitem__
явно?
И почему это должен быть kwarg? Не вызывает ли это проблемы при использованииOrderedDict
в случаях наследования алмазов, так как он переходит непосредственно к родительскому классу, а не делегирует следующему в строке в mro?