Форум сайта python.su
0
Почему метод __del__ сразу же вызывается
class robot: def __init__(self, name): self.name=name def __del__(self): print('{0} уничтожается!'.format(self.name)) obj=robot('namee')
Офлайн
88
Сразу после чего?
Офлайн
103
quakerон не сразу вызывается а после завершения программы!
Почему метод __del__ сразу же вызывается
class robot: def __init__(self, name): self.name=name def __del__(self): print('{0} del'.format(self.name)) obj=robot('namee') print('hello') for i in range(5): print(i)
Отредактировано terabayt (Янв. 3, 2015 23:20:09)
Офлайн
0
ShamanЯ читал в литературе, что __del__ вызывается по запросу допустим
Сразу после чего?
del obj
Отредактировано quaker (Янв. 5, 2015 07:49:50)
Офлайн
221
Страница официальной справки
Из книги Бизли “Python подробный справочник”
Метод __del__()
вызывается перед уничтожением объекта. Вызов этого метода происходит,
только когда объект нигде больше не используется. Важно заметить, что
инструкция del x всего лишь уменьшает счетчик ссылок на объект и необя-
зательно может приводить к вызову этого метода
…
Когда происходит уничтожение экземпляра, интер-
претатор сначала отыскивает метод __del__() объекта и вызывает его. На
практике необходимость в определении метода __del__() возникает редко.
Единственное исключение – когда в процессе уничтожения объекта необ-
ходимо выполнить некоторые завершающие действия, например закрыть
файл, разорвать сетевое соединение или освободить другие системные
ресурсы. Однако даже в таких случаях нельзя полностью полагаться на
метод __del__(), потому что нет никаких гарантий, что этот метод будет
вызван при завершении работы интерпретатора. Для этих целей лучше
определить метод, такой как close(), который программа сможет явно ис-
пользовать при завершении.
Иногда для удаления ссылки на объект в программах используется ин-
струкция del. Если в этом случае счетчик ссылок уменьшается до нуля,
вызывается метод __del__(). Однако в общем случае вызов инструкции del
не обязательно приводит к вызову метода __del__().
С уничтожением объектов связана одна малозаметная проблема, которая
обусловлена тем, что не все ситуации, когда должен вызываться метод
__del__(), распознаются циклическим сборщиком мусора (что является
веской причиной не определять метод __del__() без серьезных на то осно-
ваний). Программисты, пришедшие из других языков программирования,
в которых отсутствует механизм автоматического сбора мусора (например,
C++), должны стараться уклониться от стиля программирования с не-
оправданным использованием метода __del__(). Ситуации, когда объявле-
ние метода __del__() может нарушить работу сборщика мусора, возникают
редко…
quakerвы не так поняли. Когда ваша программа закрывается происходит освобождение памяти по средством удаления объектов. И в этот момент у объекта вызывается метод __del__.
А на деле он без запроса запускается, это так и надо?
Офлайн
88
quakerВыше всё подробно описали.
Я читал в литературе, что __del__ вызывается по запросу допустим
Python 3.4.2 (default, Oct 8 2014, 13:08:17) [GCC 4.9.1] on linux Type "copyright", "credits" or "license()" for more information. >>> ================================ RESTART ================================ >>> >>> obj <__main__.robot object at 0x7f04fce67ba8> >>> del obj >>> obj Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> obj NameError: name 'obj' is not defined >>> from gc import collect >>> collect() namee уничтожается! 6 >>>
Офлайн