Tengo curiosidad acerca de los detalles de __del__
en python, cuándo y por qué se debe utilizar y para qué no se debe usar. He aprendido por las malas que no es realmente lo que se esperaría ingenuamente de un destructor, ya que no es lo opuesto a __new__
/__init__
.Cómo forzar la eliminación de un objeto python?
class Foo(object):
def __init__(self):
self.bar = None
def open(self):
if self.bar != 'open':
print 'opening the bar'
self.bar = 'open'
def close(self):
if self.bar != 'closed':
print 'closing the bar'
self.bar = 'close'
def __del__(self):
self.close()
if __name__ == '__main__':
foo = Foo()
foo.open()
del foo
import gc
gc.collect()
vi en la documentación que es no garantizados están llamados __del__()
métodos para objetos que aún existen al salir del intérprete.
- cómo se puede garantizar que para cualquier
Foo
instancias existentes cuando se cierra la intérprete, el bar está cerrado? - en el fragmento de código anterior, ¿se cierra la barra en
del foo
o engc.collect()
... o ninguno de los dos? si desea un control más preciso de esos detalles (por ejemplo, la barra debe cerrarse cuando el objeto no está referenciado), ¿cuál es la forma habitual de implementar eso? - cuando se llama
__del__
¿está garantizado que__init__
ya se ha llamado? ¿Qué pasa si el__init__
se plantea?
> La forma de cerrar recursos son los gestores de contexto, también conocido como la declaración con. Excelente consejo. No sabía que 'con' podría usarse para contener el alcance de cualquier objeto de esta manera. –
Esta respuesta es muy esclarecedora. ¡Gracias por la explicación clara! –