从OrderedDict和defaultdict继承子类

时间:2012-03-31 00:25:45

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

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中获得可能会使这更简单?

2 个答案:

答案 0 :(得分:7)

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

您需要为defaultdict实施的所有内容都是一些自定义__init__逻辑和极其简单的__missing__

如果您继承自defaultdict,则必须委派或重新实施至少__setitem____delitem____iter__以重现有序操作。您仍然需要在__init__中进行设置工作,尽管您可能会继承或根据您的需要省略其他一些方法。

请查看the original recipeany of the others linked to from another Stack Overflow question了解相关内容。

答案 1 :(得分:3)

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

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