|
|||
|
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' """ |
|
|
||||
|
||||
|
|
|
|||
|
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')]) |
|
|||
|
On Feb 22, 10:10*am, Peter Otten <__pete...@web.de> wrote:
> 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')]) Thank you! That worked. Languages. Some of them automatically call the default base-class constructors, others don't. Apparently. |
|
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|