从defaultddict和OrderedDi继承

2024-10-03 17:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试从^{}和{a2}继承,如下所示:

class OrderedDefaultDict(defaultdict, OrderedDict): pass

就像这样:

^{pr2}$

为了创建一个有序的default dict(一个应该记住新默认项的生成顺序的类),但是它似乎抛出了一个错误:

TypeError: multiple bases have instance lay-out conflict

我读过here这是因为它们都是用C实现的。在禁用Python的OrderedDict的C实现时,请在collections模块中注释这一节:

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实现它可能更容易些)

第一个问题是这两个问题中最重要的一个,因为通过子类化OrderedDict来实现它不会带来问题。在


Tags: defaulta2顺序错误passmultiplecollectionsdict
1条回答
网友
1楼 · 发布于 2024-10-03 17:23:09

通过定义defaultdict方法,可以简单地实现defaultdict的功能:

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

相关问题 更多 >