Bruce Eckel wrote: > Notice that both classes are identical, except that one inherits from > dict (and works) and the other inherits from OrderedDict and fails. > Has anyone seen this before? Thanks. > > import collections > > class Y(dict): > def __init__(self, stuff): > for k, v in stuff: > self[k] = v > > # This works: > print Y([('a', 'b'), ('c', 'd')]) > > class X(collections.OrderedDict): > def __init__(self, stuff): > for k, v in stuff: > self[k] = v > > # This doesn't: > print X([('a', 'b'), ('c', 'd')]) > > """ Output: > {'a': 'b', 'c': 'd'} > Traceback (most recent call last): > File "OrderedDictInheritance.py", line 17, in <module> > print X([('a', 'b'), ('c', 'd')]) > File "OrderedDictInheritance.py", line 14, in __init__ > self[k] = v > File "C:\Python27\lib\collections.py", line 58, in __setitem__ > root = self.__root > AttributeError: 'X' object has no attribute '_OrderedDict__root' > """
Looks like invoking OrderedDict.__init__() is necessary: >>> from collections import OrderedDict >>> class X(OrderedDict): ... def __init__(self, stuff): ... super(X, self).__init__() ... for k, v in stuff: ... self[k] = v ... >>> X([("a", "b"), ("c", "d")]) X([('a', 'b'), ('c', 'd')]) -- http://mail.python.org/mailman/listinfo/python-list