Tengo una clase que ajusta algunas funcionalidades de manejo de archivos que necesito. Otra clase crea una instancia del filehandler
y la usa durante un tiempo indeterminado. Eventualmente, se destruye el caller
, lo que destruye la única referencia al filehandler
.Contenedor de clase alrededor del archivo: forma correcta de cerrar el identificador del archivo cuando ya no se hace referencia a él
¿Cuál es la mejor manera de tener el filehandler
cerca del archivo?
Actualmente uso __del__(self)
pero después de ver severaldifferentquestionsand articles, estoy bajo la impresión de que esto se considera una mala cosa .
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefile = open(dbf, 'rb')
def __del__(self):
self.thefile.close()
Esa es la parte relevante del controlador. El objetivo de la clase es abstraer los detalles del trabajo con el objeto de archivo subyacente y también evitar leer todo el archivo en la memoria innecesariamente. Sin embargo, parte del manejo del archivo subyacente es cerrarlo cuando el objeto se sale del alcance.
Se supone que el caller
no conoce o no le importan los detalles del filehandler
. Es el trabajo de filehandler
liberar todos los recursos necesarios cuando se sale del alcance. Esa es una de las razones por las que fue abstraída en primer lugar. Por lo tanto, parece que tengo que mover el código filehandler
al objeto que llama o tratar con una abstracción con goteras.
¿Pensamientos?
buen truco con abrir el archivo en '__ __enter()' - también se puede hacer un poco de magia allí para retener la posición del archivo entre abre/cierra. – kindall
Muy bien, esto está mucho más cerca de lo que quería. Los ciclos de ref son lo primero que revisé, y no tengo ninguno. Pero algunos artículos dicen que las cadenas de objetos completas no se podrán recoger si un objeto hoja tiene un método del del, independientemente de los ciclos de ref. –
@SpencerRathbun: toda la documentación que he podido encontrar indica que los artículos son incobrables ** solo si ** hay ciclos de ref. –