Quiero escribir una clase personalizada que se comporte como dict, entonces, estoy heredando dict.
Mi pregunta, sin embargo, es: ¿Necesito crear un dictmiembro privado en mi __init__()método? No veo el sentido de esto, ya que ya tengo el dictcomportamiento si simplemente heredo de dict.
¿Alguien puede señalar por qué la mayoría de los fragmentos de herencia se parecen al siguiente?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
En lugar de lo más simple ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
De hecho, creo que sospecho que la respuesta a la pregunta es que los usuarios no pueden acceder directamente a su diccionario (es decir, tienen que utilizar los métodos de acceso que ha proporcionado).
Sin embargo, ¿qué pasa con el operador de acceso a la matriz []? ¿Cómo se implementaría eso? Hasta ahora, no he visto un ejemplo que muestre cómo anular el []operador.
Entonces si un [] no se proporciona función de acceso en la clase personalizada, ¿los métodos base heredados operarán en un diccionario diferente?
Probé el siguiente fragmento para probar mi comprensión de la herencia de Python:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
Tuve el siguiente error:
KeyError: <identificación de función incorporada>
¿Qué pasa con el código anterior?
¿Cómo corrijo la clase myDictpara poder escribir código como este?
md = myDict()
md['id'] = 123
[Editar]
He editado el ejemplo de código anterior para deshacerme del tonto error que cometí antes de salir corriendo de mi escritorio. Fue un error tipográfico (debería haberlo visto en el mensaje de error).
dict, entonces debe usar el objeto en sí (usosuper) en lugar de simplemente delegar a la instancia, lo__dict__que esencialmente significa que está creando dos dictados para cada instancia.