我想用两个创建一个类:collections.OrderedDict
和collections.DefaultDict
。这样我就可以获得一个有序的字典,并为访问的现有密钥设置一个默认值。什么方法可以做到这一点?
我的解决方案是围绕我上面提到的两个类创建另一个类。由于我认为每个类中的方法具有相同的名称会导致错误吗?
from collections import defaultdict, OrderedDict
class owndic(OrderedDict, defaultdict):
pass
制造
TypeError: multiple bases have instance lay-out conflict
干杯!
答案 0 :(得分:14)
发生此异常是因为您尝试从多个内置类型继承,这些内置类型无法在C级别相互协作。这意味着这些类在其类似属性的功能上存在冲突。在这种情况下,OrderedDict
和defaultdict
都是两个类似字典的类型,具有自己独特的__setitem__
属性以及处理键和值的不同方式。
在C级别,当best_base
函数无法计算多个基类中的最佳基数时,会发生此错误。有许多其他原因导致此功能无法计算其他基础中的最佳基数或赢家,但在这种情况下,当以下两种情况都不会发生时,会发生错误。 winner
不是无,winner
不是candidate
* 的子类型,candidate
不是winner
的子类型。< / p>
candidate = solid_base(base_i);
if (winner == NULL) {
winner = candidate;
base = base_i;
}
else if (PyType_IsSubtype(winner, candidate))
;
else if (PyType_IsSubtype(candidate, winner)) {
winner = candidate;
base = base_i;
}
else {
PyErr_SetString(
PyExc_TypeError,
"multiple bases have "
"instance lay-out conflict");
return NULL;
}
但是,如果您希望同时受益于defaultdict()
和OrderedDict()
的功能,则只需使用OrderedDict
及其内置setdefault
即可属性。
以下是一个例子:
In [13]: d = OrderedDict()
In [14]: for i, j in enumerate(['k', 'r', 'k', 'j', 'j', 't']):
d.setdefault(j, []).append(i)
....:
In [15]: d
Out[15]: OrderedDict([('k', [0, 2]), ('r', [1]), ('j', [3, 4]), ('t', [5])])
<子>
* candidate
是base_i
的坚实基础,是传递给类调用者的基础之一,使用solid_base
函数计算。
子>