ordereddict example python inheritance subclass ordereddictionary

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.