加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – OrderedDict为什么不使用super?

发布时间:2020-12-20 13:13:59 所属栏目:Python 来源:网络整理
导读:我们可以通过使用多重继承来轻松创建OrderedCounter: from collections import Counter,OrderedDict class OrderedCounter(Counter,OrderedDict): ... pass... OrderedCounter('Mississippi').items()[('M',1),('i',4),('s',('p',2)] 如果我错了,请纠正我,
我们可以通过使用多重继承来轻松创建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中的下一行吗?

解决方法

这是一种微观优化.查找dict_setitem参数比查找dict .__ setitem__或super().__ setitem__稍快.

如果你有另一个类覆盖__setitem__,这可能会导致多重继承问题,但OrderedDict不是为那种钻石结构方法覆盖而设计的.对于OrderedDict来支持它,它必须非常谨慎地保证在排序信息与dict结构不一致时,如果他们试图索引OrderedDict,另一个类的方法可能会看到什么.这样的保证可能太乱了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读