我们可以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)
调用必须根据mro的super
“父母之前的兄弟姐妹”规则进行委托,因此自定义类使用 an作为存储后端。 OrderedDict
然而,一位同事最近指出,令我惊讶的是,OrderedDict
它不使用 super:
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 中的下一个行?