我们可以通过使用多重继承来轻松创建OrderedCounter:
>>> from collections import Counter,OrderedDict >>> class OrderedCounter(Counter,OrderedDict): ... pass ... >>> OrderedCounter('Mississippi').items() [('M',1),('i',4),('s',('p',2)]
如果我错了,请纠正我,但这至关重要依赖于Counter
uses super
的事实:
class Counter(dict): def __init__(*args,**kwds): ... super(Counter,self).__init__() ...
也就是说,魔术的作用是有效的
>>> OrderedCounter.__mro__ (__main__.OrderedCounter,collections.Counter,collections.OrderedDict,dict,object)
超级调用必须根据父母的mro规则之前的兄弟姐妹进行委托,自定义类使用OrderedDict作为存储后端.
然而,一位同事最近指出,令我惊讶的是,OrderedDict doesn’t使用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,value)
起初我以为可能是因为OrderedDict排在第一位且雷蒙德后来没有费心去改变它,但似乎超级早于OrderedDict.
为什么OrderedDict明确地调用dict .__ setitem__?
为什么它需要成为一个kwarg?在钻石继承情况下使用OrderedDict时,这不会造成麻烦,因为它直接传递给父类而不是委托给mro中的下一行吗?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。