__del__
само по себе не плохо. Вам просто нужно быть очень осторожным, чтобы не создавать ссылочные циклы в объектах, для которых определено __del__
. Если вам действительно нужно создать циклы (родитель относится к потомку, который ссылается на родителя), тогда вы захотите использовать модуль weakref
.
Итак, __del__
нормально, просто будьте осторожны с циклическими ссылками.
Сборка мусора. Важным моментом здесь является то, что когда объект выходит из области видимости, он может быть сборщиком мусора, и фактически будет сборщиком мусора ... но когда? Там нет никакой гарантии, когда, и разные реализации Python имеют разные характеристики в этой области. Поэтому для управления ресурсами лучше быть явным и либо добавить .close()
в свой filehandler
, либо, если ваше использование совместимо, добавить методы __enter__
и __exit__
.
Здесь описаны методы __enter__
и __exit__
. Одна очень хорошая вещь о них заключается в том, что __exit__
вызывается даже при возникновении исключений, так что вы можете считать или ваши ресурсы закрыты изящно.
Ваш код, улучшенный для __enter__
/ __exit__
:
class fileHandler:
def __init__(self, dbf):
self.logger = logging.getLogger('fileHandler')
self.thefilename = dbf
def __enter__(self):
self.thefile = open(self.thefilename, 'rb')
return self
def __exit__(self, *args):
self.thefile.close()
Обратите внимание, что файл открывается в __enter__
вместо __init__
- это позволяет вам создать объект обработчика файлов один раз, а затем использовать его всякий раз, когда вам нужно, в with
без его воссоздания:
fh = filehandler('some_dbf')
with fh:
#file is now opened
#do some stuff
#file is now closed
#blah blah
#need the file again, so
with fh:
# file is open again, do some stuff with it
#etc, etc