对Python dict
进行子类化按预期工作:
>>> class DictSub(dict):
... def __init__(self):
... self[1] = 10
...
>>> DictSub()
{1: 10}
然而,使用collections.OrderedDict
执行相同的操作不起作用:
>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
... def __init__(self):
... self[1] = 10
...
>>> OrdDictSub()
(…)
AttributeError: 'OrdDictSub' object has no attribute '_OrderedDict__root'
因此,OrderedDict实现使用私有__root
属性,这可以防止子类OrdDictSub
表现得像DictSub
子类。为什么?如何从OrderedDict继承?
答案 0 :(得分:34)
您需要从OrderedDict.__init__
__init__
class OrdDictSub(collections.OrderedDict):
def __init__(self):
super(OrdDictSub, self).__init__()
您尚未给OrderedDict
初始化自己的机会。从技术上讲,您也希望为dict
子类执行此操作,因为您需要完全初始化dict
。 dict
在没有它的情况下工作的事实只是运气。
答案 1 :(得分:2)
尝试在__init__
方法中初始化超类:
def __init__(self):
collections.OrderedDict.__init__(self)
self[1] = 10
这是初始化子类的常规方法。你通常不会拥有来调用超类的__init__
方法,但如果你不了解超类的实现,你真的应该调用__init__
。