Re: ¿puede un objeto "destruirse" a si mismo?

=?UTF-8?Q?Andr=C3=A9s=20Moya=20 Andres.Moya en hispalinux.es
Mie Jun 25 18:01:47 CEST 2008


Asunto: [Python-es] ¿puede un objeto "destruirse" a si mismo?
De: "Jose Caballero" <jcaballero.hep en gmail.com>

> quizás es una pregunta algo rara, o tal vez no, no lo sé. ¿Es posible
> dotar a una clase de un método de tal forma que cuando un objeto
> particular lo invoca, dicho objeto se "destruya"? Tengo una clase
> donde cada objeto está asociado a un fichero de texto. Los métodos y
> atributos de la clase son para obtener información y/o manipular
> dicho fichero. Me gustaría saber si puedo crear un método delete()
> que, tras borrar el fichero, destruya el objeto. No tiene sentido
> mantener un objeto asociado a un fichero que ya no existe.
>
> Otra opción ("current") es que la clase tenga un atributo booleano
> 'valid'. Cuando se invoca algún método y el objeto 'no es válido' se
> lanza una excepción.

Buenas, Jose.

Pues te diría que lo que propones no es buena idea. En Python la destrucción de objetos la realiza el recolector de basura cuando ya no queda ninguna variable que apunte al objeto (bien porque las variables apuntan a otro sitio, o porque han sido destruidas por salirse del ámbito o por haber ejecutado el comando "del" sobre ellas). El destructor __del__ no destruye el objeto; lo que ocurre es que es llamado cuando un objeto va a ser destruido, y te permite realizar algún trabajo de liberación de otras cosas antes (por ejemplo, cerrar el fichero si lo tenías abierto).

Si se pudiera liberar la memoria del objeto mientras que todavía hay variables que apuntan a él, tendríamos punteros inválidos, como ocurre en C, y es uno de los grandes problemas de ese lenguaje. En python creo que no se puede hacer (y si se puede, no debería hacerse a la ligera).

Aunque te parezca raro, es mucho más conveniente tu segundo enfoque. No es necesario que añadas ningún atributo especial. Probablemente dentro de tu clase guardas un puntero a un objeto de tipo File. Yo lo que haría sería crear métodos open(), close() y delete(). Los dos primeros llaman a los correspondientes open() y close() del fichero. Y el tercero se asegura primero que el fichero está cerrado, y luego lo borra y pone el puntero a None.

Entonces lo que tienes que hacer es en los demás métodos, comprobar que el puntero no es None y no está cerrado (llamando al método closed() del mismo), en caso contrario lanzas una excepción.

Y ya lo guay guay sería que este chequeo lo hicieras mediante una "precondición". Esto ya es un poco friki, aunque en mi opinión debería estar incluido dentro del python estándar:

http://blog.chuidiang.com/2007/01/16/diseno-por-contrato/
http://www.wayforward.net/pycontract/
http://www.python.org/dev/peps/pep-0316/

---
Andrés.Moya en hispalinux.es


------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es