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.