viernes, enero 20, 2006

Ejemplo de reimplementación de los metodos que modifican un diccionario [python]



class MyDict(dict):

def __setitem__(self,c,v):
print "En __setitem__"
dict.__setitem__(self,c,v)

def __delitem__(self,c):
print "En __delitem__"
dict.__delitem__(self,c)

def pop(self,c):
print "En pop"
return dict.pop(self,c)

def popitem(self):
# Saca la key del principio
print "En popitem"
return dict.popitem(self)

def clear(self):
print "En Clear"
dict.clear(self)

def update(self,D):
print "En update"
# !Ojo! si tenemos un tratamiento por key, al invocar al update del padre
# no se ejecutaría. Vamos... que update no hace uso de __setitem__.
# Con lo cual nos tocaria hacer a peluski aquí el tratamiento especifico
dict.update(self,D)

def setdefault(self,c,v=None):
print "En setdefault"
return dict.setdefault(self,c,v)


Si heredas un diccionario será para aprovechar la funcionalidad que te ofrece, y ampliarla.
La segunda opción, y en principio mejor será que internamente tu clase haga uso de un diccionario.

Por ejemplo para eliminar un elemento tenemos 3 posibilidades: 'pop', 'popitem' y hacer uso de 'del'. Estaría bien que tanto 'pop', como 'popitem' hicieran uso de '__delitem__' como hace 'del' de esta manera con meter nuestro código en '__delitem__' valdría para las tres opciones de borrado. Pero como no funciona así, es necesario crear un método adicional que sea invocado desde las tres.
Un ejemplo todavía peor es el de 'update'.

Det todas formas por principio deberíamos siempre preferir la composición a la herencia: que nuestra clase haga uso del diccionario en lugar de heredar de él.

No hay comentarios: