Al intentar modificar el valor de una variable de un objeto se llama a la función __setattr__, si sobrescribimos esta función se puede variar el comportamiendo habitual. Lo mismo podemos hacer con __delattr__.
Así se podría mantener una distinción en una clase entre variables de solo lectura y lectura/escritura.
#!/usr/bin/python
class Clase:
__onlyReadVars=['x', 'y']
def __init__(self):
self.__dict__['x'] = 8
self.__dict__['y'] = 1
self.a = 2
def __setattr__(self, nombre, valor):
if nombre in self.__onlyReadVars:
raise Exception('No se puede sobrescribir %s' % nombre)
else:
self.__dict__[nombre] = valor
def __delattr__(self, nombre):
if nombre in self.__onlyReadVars:
raise Exception('No se puede eliminar %s' % nombre)
else:
del self.__dict__[nombre]
De esta forma si intentamos eliminar o sobrescribir alguna de las variables de solo lectura se lanzará una excepción.
Aun así, hay una manera de saltarse el filtro si hacemos lo siguiente.
c = Clase()
c.__dict__['x'] = 30
__dict__ es un diccionario con todas las variables del objeto y sus valores, al modificarlo no se llama a la función __setattr__, __getattr__ ni __delattr__.
0 comentarios:
Publicar un comentario