example - ordereddict python
¿Cómo subclasificar un OrderedDict? (2)
Intente inicializar la superclase en el método __init__ :
def __init__(self):
collections.OrderedDict.__init__(self)
self[1] = 10
Esta es la forma normal de inicializar una subclase. No tiene que llamar al método __init__ la superclase en general, pero si no tiene conocimiento de la implementación de la superclase, realmente debería llamar a __init__ .
Subclasificar un dict Python funciona como se espera:
>>> class DictSub(dict):
... def __init__(self):
... self[1] = 10
...
>>> DictSub()
{1: 10}
Sin embargo, hacer lo mismo con collections.OrderedDict no funciona:
>>> import collections
>>> class OrdDictSub(collections.OrderedDict):
... def __init__(self):
... self[1] = 10
...
>>> OrdDictSub()
(…)
AttributeError: ''OrdDictSub'' object has no attribute ''_OrderedDict__root''
Por lo tanto, la implementación de OrderedDict utiliza un atributo privado __root , que evita que la subclase OrdDictSub comporte como la subclase DictSub . ¿Por qué? ¿Cómo se puede heredar de un OrderedDict?
OrderedDict.__init__ invocar OrderedDict.__init__ desde su __init__ :
class OrdDictSub(collections.OrderedDict):
def __init__(self):
super(OrdDictSub, self).__init__()
No le has dado a OrderedDict oportunidad de inicializarse. Técnicamente, también desea hacer esto para su subclase dict , ya que desea un dict inicializado completamente. El hecho de que el dict funcione sin él es solo suerte.