继承自defaultddict和OrderedDict

时间:2016-04-19 19:37:29

标签: python python-3.x inheritance

我尝试过继承collections.defaultdictcollections.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

我已经设法从两者继承,但它似乎没有像我预期的那样工作。那我有两个问题:

  1. 为什么你不能继承用C编写的两个类?我会理解你是否能够继承任何用C语言编写的类,但为什么你能从一个继承而不是从2?
  2. 通过继承OrderedDict并覆盖__getitem__()以匹配defaultdict的行为,可以轻松实现我所请求的类。 是否有更好的方法(最好是在标准库中)来模仿相同的行为?或者是将OrderedDict子类化为最优? (子类化defaultdict也是可能的,但实现它可能更容易使用OrderedDict
  3. 第一个问题是两个中的重要问题,因为通过子类化OrderedDict来实现它不应该造成问题。

1 个答案:

答案 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