sábado, 13 de septiembre de 2008

Variables de solo lectura en python

Hay algunos tipos de variables, como pueden ser variables de estado, que no interesa que se modifiquen desde fuera de los métodos de una clase, aunque sí que se pueda leer su valor.

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: