В общем, чтобы убедиться, что что-то происходит независимо от того, что вы используете
from exceptions import NameError
try:
f = open(x)
except ErrorType as e:
pass # handle the error
finally:
try:
f.close()
except NameError: pass
finally
, будут выполняться независимо от того, есть ли ошибка в блоке try
и есть ли или нет ошибки в обработке ошибок, которая имеет место в блоках except
. Если вы не обрабатываете возбужденное исключение, оно все равно будет поднято после того, как будет отменен блок finally
.
Общий способ убедиться, что файл закрыт, - это использовать «менеджер контекста» ".
http://docs.python.org/reference/datamodel.html#context-managers
with open(x) as f:
# do stuff
Это автоматически закроет f
.
Для вашего вопроса №2, bar
немедленно закрывается, когда счетчик ссылок достигает нуля, поэтому del foo
, если других ссылок нет.
Объекты НЕ созданы __init__
, они созданы __new__
.
http://docs.python.org/reference/datamodel.html#object.new
Когда вы делаете foo = Foo()
, на самом деле происходит две вещи: сначала создается новый объект __new__
, затем он инициализируется __init__
. Таким образом, вы не можете называть del foo
до того, как эти шаги будут выполнены. Однако, если в __init__
есть ошибка, __del__
все равно будет вызываться, потому что объект фактически был создан в __new__
.
Редактировать: Исправлено, когда удаление происходит, если счетчик ссылок уменьшается до равен нулю.