【问题标题】:subclassing from OrderedDict and defaultdictOrderedDict 和 defaultdict 的子类化
【发布时间】:2012-04-14 16:00:36
【问题描述】:

Raymond Hettinger showed 一种非常酷的组合集合类的方式:

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 派生可能会使这更简单?

【问题讨论】:

  • 当我们谈到这个话题时,有人可以向我解释一下 OrderedDict 示例是如何在没有任何明确的 super-delegation 的情况下实际获得 OrderedDict 功能的吗?是因为superCounter 内的某处调用,而是通过OrderedDict 重新路由,而不是像往常那样直接转到dict?或者只是什么?
  • @KarlKnechtel 你的意思是OrderedCounter,但这是个好问题。
  • @agf er,是的,完全正确。愚蠢的编辑超时...... :(
  • @KarlKnechtel 我认为答案是Counter 没有实现OrderedDict 需要实现才能工作的任何dict 方法,而dict 是两者的基类CounterOrderedDict,因此对 OrderedCounterCounter 中的这些方法的实例的正常调用被委托给 OrderedDict

标签: python collections python-3.x multiple-inheritance


【解决方案1】:

OrderedDict 继承您链接到的答案是最简单的方法。实现有序存储比从工厂函数获取默认值要多。

您需要为defaultdict 实现一点自定义__init__ 逻辑和极其简单的__missing__

如果您改为从defaultdict 继承,则必须至少委托或重新实现__setitem____delitem____iter__ 以重现有序操作。您仍然需要在 __init__ 中进行设置工作,不过您可以根据需要继承或简单地省略一些其他方法。

看看the original recipeany of the others linked to from another Stack Overflow question 会带来什么。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2020-04-18
      • 2023-03-26
      • 2021-11-28
      相关资源
      最近更新 更多