13.01.2015 Views

Booklet A4/A5 - PET: Python Entre Todos - Python Argentina

Booklet A4/A5 - PET: Python Entre Todos - Python Argentina

Booklet A4/A5 - PET: Python Entre Todos - Python Argentina

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Finalizando 55<br />

2 La primera es la forma recomendada y es la que seguramente<br />

elegirás, salvo que andes decorando clases en <strong>Python</strong> < 2.6<br />

<strong>Python</strong> <strong>Entre</strong> <strong>Todos</strong> (número 1, Agosto 2010) — http://revista.python.org.ar<br />

14 Referencias circulares<br />

cómodo, hay que admitir, así que si vamos a apoyarnos en esta comodidad, hagámoslo<br />

a conciencia, sabiendo lo que hacemos, y las limitaciones que tiene:<br />

Referencias circulares<br />

Nuestra clase inútil utiliza un destructor para cerrar el archivo… cosa que se considera<br />

incorrecta en <strong>Python</strong>. ¿Por qué, tanta gente se pregunta.<br />

Veamos:<br />

>>> objetoInutil = ClaseInutil("archivito.txt")<br />

abriendo<br />

>>> objetoInutil2 = ClaseInutil("archivito.txt")<br />

abriendo<br />

>>> objetoInutil.circulito = objetoInutil2<br />

>>> objetoInutil2.circulito = objetoInutil<br />

>>> objetoInutil = objetoInutil2 = None<br />

Ahora, ejercicio interesante para el lector pensar qué saldrá por la consola luego de<br />

esa última sentencia. No es poco común equivocarse aquí, y decir: imprime “cerrando”<br />

dos veces. No, no lo hace. Adelante, hagan la prueba.<br />

Para entender qué sucede, tipear en la consola import gc ; gc.garbage. Ahí están<br />

nuestras dos instancias de ClaseInutil.<br />

¿Qué sucedió Lo veremos en detalle en otra entrega. Lo importante para recordar es<br />

que los destructores se llevan muy mal con las referencias circulares. Y hay muchas,<br />

muchas formas de caer en referencias circulares, y no siempre son sencillas de<br />

detectar, y siempre son más difíciles aún de evitar. gc.garbage va a ser nuestro amigo<br />

siempre que sospechemos de este tipo de problemas.<br />

Resucitando objetos<br />

Las personas no son las únicas que pueden recibir CPR (resucitación cardiopulmonar).<br />

Los objetos en python también. Realmente, a mí personalmente, nunca me fue útil para<br />

nada. Nada de nada de nada. Pero alguien debe haber pensado que estaba bueno,<br />

porque es parte del lenguaje:<br />

Si un destructor de una instancia, en el proceso, crea una referencia alcanzable a sí<br />

mismo, la destrucción se cancela, y el objeto vive.<br />

Capaz que puede servir para depuración, o para hacer cosas locas. Imaginemos que un<br />

recurso lo tengo que destruir sí o sí en el thread principal (no es descabellado, sucede<br />

<strong>Python</strong> <strong>Entre</strong> <strong>Todos</strong> (número 1, Agosto 2010) — http://revista.python.org.ar

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!