我尝试过继承collections.defaultdict
和collections.OrderedDict
,如下所示:
class OrderedDefaultDict(defaultdict, OrderedDict): pass
并且像这样:
class OrderedDefaultDict(OrderedDict, defaultdict): pass
为了创建一个有序的默认dict(一个应该记住生成新默认项的顺序的类),但它似乎抛出错误说明:
TypeError: multiple bases have instance lay-out conflict
我已阅读here,因为它们都是用C实现的。通过在OrderedDict
模块中对此部分进行注释来禁用Python的collections
C实现:
try:
from _collections import OrderedDict
except ImportError:
# Leave the pure Python version in place.
pass
我已经设法从两者继承,但它似乎没有像我预期的那样工作。那我有两个问题:
OrderedDict
并覆盖__getitem__()
以匹配defaultdict
的行为,可以轻松实现我所请求的类。 是否有更好的方法(最好是在标准库中)来模仿相同的行为?或者是将OrderedDict
子类化为最优? (子类化defaultdict
也是可能的,但实现它可能更容易使用OrderedDict
) 第一个问题是两个中的重要问题,因为通过子类化OrderedDict
来实现它不应该造成问题。
答案 0 :(得分:4)
defaultdict
的功能可以通过定义__missing__
方法简单地实现:
class DefaultOrderedDict(OrderedDict):
def __init__(self, default_factory=None, **kwargs):
OrderedDict.__init__(self, **kwargs)
self.default_factory = default_factory
def __missing__(self, key):
result = self[key] = self.default_factory()
return result