object.__del__
Позволяет определить поведение экземпляра пользовательского типа при готовности интерпретатора уничтожить его.
object.__del__(self)
self -- Ссылка на экземпляр.
Вызывается интерпретатором, когда экземпляр назначен к уничтожению. Также известен под именем «деструктор».
Если метод определён в базовом классе, то потомок должен вызывать его явно, чтобы удаление части экземпляра, реализуемой базовым классом произошло без ошибок.
Обратите внимание, что есть возможность (но не рекомендуется) в методе создать новую ссылку на экземпляр, чтобы отсрочить его уничтожение. В следующий раз, когда экземпляр будет назначен к уничтожению, метод будет вызван снова.
Не гарантируется, что метод будет вызван для объектов, всё ещё существующих на момент выхода интерпретатора.
Вызов
Вот некоторые обстоятельства, которые могут помешать счётчику дойти до нуля:
Внимание
Ввиду того, что вызов метода зависит от множества обстоятельств, исключения, возбуждаемые в ходе его исполнения игнорируются, при этом в
Кроме того, когда метод вызывается как реакция на удаление модуля (например, когда исполнение программы завершено), другие глобальные переменные, которые могут быть использованы в методе могут быть уже удалены или находится в процессе удаления (например, при завершение работы механизма импорта). Потому в реализации методов резонно использовать минимум окружения. +py1.5 Питон гарантирует, что глобальные переменные, имена которых начинаются с одиночного почерка, удаляются из модуля прежде остальных. Поэтому если на такие объекты нет ссылок, то они могут являться показателем доступности других объектов модуля на момент исполнения метода.
Если метод определён в базовом классе, то потомок должен вызывать его явно, чтобы удаление части экземпляра, реализуемой базовым классом произошло без ошибок.
Обратите внимание, что есть возможность (но не рекомендуется) в методе создать новую ссылку на экземпляр, чтобы отсрочить его уничтожение. В следующий раз, когда экземпляр будет назначен к уничтожению, метод будет вызван снова.
Не гарантируется, что метод будет вызван для объектов, всё ещё существующих на момент выхода интерпретатора.
Вызов
del x
не приводит напрямую к вызову x.__del__()
, а лишь уменьшает значение счётчика ссылок на единицу. Описываемый метод же будет вызван, только когда счётчик ссылок достигнет нуля.Вот некоторые обстоятельства, которые могут помешать счётчику дойти до нуля:
- Циклические ссылки (двусвязные списки; древовидные структуры, со ссылками на родителей и детей) — исправляется только разрывом таких ссылок. Циклические ссылки, являющиеся мусором, отлавливаются обнаружителем циклов (он включен по умолчанию), однако могут быть вычищены, только если не заданы
__del__()
на уровне Питона. За более подробным описанием того, как__del__()
влияет на обнаружитель циклов, можно узнать из документации к модулюgc
.
- Ссылка на объект в фрейме стека при возбуждении исключения (трассировка стека, хранимая в
sys.exc_info()[2]
(-py3.0sys.exc_traceback
) продлевает жизнь фрейма) — исправляется путём освобождения ссылки на объект трассировки, когда в нём более нет надобности (-py3.0sys.exc_traceback = None
).
- В интерактивном режиме ссылка на объект в фрейме стека, где возбуждено необработанное исключение (трассировка стека, хранимая в
sys.last_traceback
продлевает жизнь фрейма) — исправляется путёмsys.last_traceback = None
.
Внимание
Ввиду того, что вызов метода зависит от множества обстоятельств, исключения, возбуждаемые в ходе его исполнения игнорируются, при этом в
sys.stderr
пишется предупреждение.Кроме того, когда метод вызывается как реакция на удаление модуля (например, когда исполнение программы завершено), другие глобальные переменные, которые могут быть использованы в методе могут быть уже удалены или находится в процессе удаления (например, при завершение работы механизма импорта). Потому в реализации методов резонно использовать минимум окружения. +py1.5 Питон гарантирует, что глобальные переменные, имена которых начинаются с одиночного почерка, удаляются из модуля прежде остальных. Поэтому если на такие объекты нет ссылок, то они могут являться показателем доступности других объектов модуля на момент исполнения метода.
Синонимы поиска: object.__del__, object, __del__, деструктор деструкторы
В разделе «object (объект)»:
file (файл)
object.__add__
object.__bool__
object.__call__
object.__ceil__
object.__class__
object.__cmp__
object.__contains__
object.__copy__
object.__deepcopy__
object.__delattr__
object.__delete__
object.__delitem__
object.__delslice__
object.__dir__
object.__enter__
object.__eq__
object.__exit__
object.__floor__
object.__format__
object.__ge__
object.__get__
object.__getattr__
object.__getattribute__
object.__getitem__
object.__getslice__
object.__getstate__
object.__gt__
object.__hash__
object.__init__
object.__init_subclass__
object.__iter__
object.__le__
object.__len__
object.__lt__
object.__missing__
object.__ne__
object.__new__
object.__next__
object.next
object.__nonzero__
object.__qualname__
object.__rcmp__
object.__repr__
object.__reversed__
object.__set__
object.__setattr__
object.__setitem__
object.__set_name__
object.__setslice__
object.__setstate__
object.__slots__
object.__str__
object.__sub__
object.__subclasses__
object.__unicode__
property (свойство)
Protocols (протоколы)
slice (срез)
Встроенные исключения
На заметку
В разделе «События» можно узнать о надвигающихся событиях мира Python, а также поделиться своими. Если вы являетесь организатором встречи/конференции/спринта, зарегистрируйте это событие в указанном разделе, чтобы о нём узнали все желающие.