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中获得可能会使这更简单?
答案 0 :(得分:7)
从您链接的答案中继承OrderedDict
是最简单的方法。实现有序存储比从工厂函数获取默认值要多得多。
您需要为defaultdict
实施的所有内容都是一些自定义__init__
逻辑和极其简单的__missing__
。
如果您继承自defaultdict
,则必须委派或重新实施至少__setitem__
,__delitem__
和__iter__
以重现有序操作。您仍然需要在__init__
中进行设置工作,尽管您可能会继承或根据您的需要省略其他一些方法。
请查看the original recipe或any 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)