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

Jose Caballero jcaballero.hep en gmail.com
Mie Jun 25 17:55:31 CEST 2008


Hola Andres,

en realidad no. No me parece raro que el segundo enfoque sea mejor. De
hecho, es el que he implementado. Pero queria saber si se podia hacer de la
otra forma...

Gracias por los comentarios, y por los links. En cuanto tenga un rato libre
les echo un vistazo.


Saludos,
Jose


El día 25 de junio de 2008 12:01, =?UTF-8?Q?Andr=C3=A9s=20Moya=20 <
Andres.Moya en hispalinux.es> escribió:

> 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
>
>
>
> _______________________________________________
> Lista de correo Python-es
> http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>
_______________________________________________
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