Tengo una clase donde las instancias de esta clase necesitan rastrear los cambios a sus atributos.¿Realizar un seguimiento de los cambios a listas y diccionarios en python?
Ejemplo: obj.att = 2
sería algo que puede rastrearse fácilmente simplemente anulando el __setattr__
de obj
.
Sin embargo, hay un problema cuando el atributo que quiero cambiar es un objeto en sí, como una lista o un dict.
¿Cómo podría rastrear cosas como obj.att.append(1)
o obj.att.pop(2)
?
Estoy pensando en ampliar la lista o la clase de diccionario, pero mono parches instancias de dichas clases una vez que el obj
y la obj.att
es a la vez inicializado de manera que obj
recibe una notificación cuando cosas como .append
se llama. De alguna manera, eso no se siente muy elegante.
La otra forma en que puedo pensar sería pasar una instancia de obj
en la inicialización de la lista, pero eso rompería una gran cantidad de código existente y parece incluso menos elegante que el método anterior.
¿Alguna otra idea/sugerencia? ¿Hay una solución simple que me falta aquí?
qué pasa hacer los objetos internos y permitir acceso desde el exterior solo sobre las clases getter y setter? – joni
puede serializar los objetos y comparar las versiones serializadas. –
Estoy de acuerdo con joni. Considera la Ley de Demeter aquí. De forma alternativa, no permita el acceso a 'attr' directamente, pero proporcione getters y setters que creen una copia profunda. – Thomas