问题 从OrderedDict和defaultdict继承子类


Raymond Hettinger 显示 一种非常酷的方式来组合集合类:

from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
  pass
# if pickle support is desired, see original post

我想为OrderedDict和defaultdict做类似的事情。但当然,defaultdict有不同之处 __init__ 签名,所以需要额外的工作。解决这个问题最简洁的方法是什么?我使用Python 3.3。

我找到了一个很好的解决方案: https://stackoverflow.com/a/4127426/336527,但我想也许从defaultdict得到可能会使这更简单?


10310
2018-03-31 00:25


起源

当我们讨论这个主题时,有人可以向我解释OrderedDict示例如何实际获得OrderedDict功能而无需任何显式 super - 去那个班级?是因为 super 打电话到某处 Counter 重新路由 OrderedDict 而不是去 dict 他们通常会直接吗?还是什么? - Karl Knechtel
@KarlKnechtel你的意思是 OrderedCounter,但好问题。 - agf
@agf呃,是的,确切地说。愚蠢的编辑超时...... :( - Karl Knechtel
@KarlKnechtel我认为答案是这样的 Counter 没有实现任何 dict 方法 OrderedDict 需要实施工作,和 dict 是两者的基类 Counter 和 OrderedDict,所以正常调用实例中的那些方法 OrderedCounter 要么 Counter 被委派给 OrderedDict。 - agf
可能重复 我可以在Python中执行有序的默认dict吗? - drs


答案:


继承自 OrderedDict 在你联系的答案中是最简单的方法。实现有序存储比从工厂函数获取默认值更有意义。

所有你需要实现的 defaultdict 有点习惯 __init__ 逻辑和极其简单 __missing__

如果你改为继承 defaultdict,你必须至少委托或重新实施 __setitem____delitem__ 和 __iter__ 重现有序操作。您仍然需要进行设置工作 __init__虽然您可以继承或根据您的需要简单地省略其他一些方法。

看一眼 原始配方 要么 来自另一个Stack Overflow问题的任何其他链接 这将带来什么。


7
2018-03-31 01:17





我找到了一种方法来对它们进行子类化,但不确定是否存在错误:

class OrderedDefaultDict(defaultdict, OrderedDict):
    def __init__(self, default, *args, **kwargs):
        defaultdict.__init__(self, default)
        OrderedDict.__init__(self, *args, **kwargs)

3
2017-09-03 08:58