python – OrderedDict为什么不使用super?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – OrderedDict为什么不使用super?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1484字,纯文字阅读大概需要3分钟。
内容图文
![python – OrderedDict为什么不使用super?](/upload/InfoBanner/zyjiaocheng/767/ed4dba015baf4249a066bf4e6dc44bd3.jpg)
我们可以通过使用多重继承来轻松创建OrderedCounter:
>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict):
... pass
...
>>> OrderedCounter('Mississippi').items()
[('M', 1), ('i', 4), ('s', 4), ('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, key, value)
起初我以为可能是因为OrderedDict排在第一位且雷蒙德后来没有费心去改变它,但似乎超级早于OrderedDict.
为什么OrderedDict明确地调用dict .__ setitem__?
为什么它需要成为一个kwarg?在钻石继承情况下使用OrderedDict时,这不会造成麻烦,因为它直接传递给父类而不是委托给mro中的下一行吗?
解决方法:
这是一种微观优化.查找dict_setitem参数比查找dict .__ setitem__或super().__ setitem__稍快.
如果你有另一个类覆盖__setitem__,这可能会导致多重继承问题,但OrderedDict不是为那种钻石结构方法覆盖而设计的.对于OrderedDict来支持它,它必须非常谨慎地保证在排序信息与dict结构不一致时,如果他们试图索引OrderedDict,另一个类的方法可能会看到什么.这样的保证可能太乱了.
内容总结
以上是互联网集市为您收集整理的python – OrderedDict为什么不使用super?全部内容,希望文章能够帮你解决python – OrderedDict为什么不使用super?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。