Consideremos el siguiente código de ejemploEn la segunda inicialización de un objeto, ¿por qué __init__ se llama antes de __del__?
class A:
def __init__(self, i):
self.i = i
print("Initializing object {}".format(self.i))
def __del__(self):
print("Deleting object {}".format(self.i))
for i in [1, 2]:
a = A(i)
Creación del objeto dentro del bucle se pretende asegurar que el destructor de A sería llamado antes se crearía el nuevo Un objeto. Pero al parecer, ocurre lo siguiente:
objeto Inicialización 1
objeto Inicialización 2
objeto Eliminación de 1
objeto Eliminación de 2
¿Por qué es el destructor del objeto 1 solamente llamado después de que el nuevo objeto se ha inicializado? ¿Es esto un comportamiento intencional? Sé que el bucle for no tiene un alcance propio en python. En C++, por ejemplo, el destructor de 1 ciertamente se llamaría antes del constructor para el objeto 2 (al menos si el objeto se declara dentro del bucle).
En mi programa, quiero asegurarme de que el objeto viejo se elimine antes de que se cree el nuevo. ¿Hay alguna otra posibilidad aparte de eliminar a
explícitamente al final del ciclo for?
Gracias de antemano.
Suceso interesante si cambia el bucle a más '[1,2,3]'. – kennytm
Esto sería una buena pregunta para la entrevista. – pajton
Re último párrafo: no desea hacer eso. Porque no se puede (GC no es determinista y el recuento es un detalle de implementación), y no es necesario hacerlo de todos modos. Si tiene recursos para eliminar, use un administrador de contexto (instrucción 'with') o agregue un método como' .close() 'y asegúrese de que se invoque. – delnan