Найти - Пользователи
Полная версия: использование метода __del__
Начало » Python для новичков » использование метода __del__
1
quaker
Почему метод __del__ сразу же вызывается
class robot:
    def __init__(self, name):
        self.name=name
    def __del__(self):
        print('{0} уничтожается!'.format(self.name))
obj=robot('namee')
Вывод:
namee уничтожается!
Shaman
Сразу после чего?
terabayt
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)
quaker
Shaman
Сразу после чего?
Я читал в литературе, что __del__ вызывается по запросу допустим
del obj
А на деле он без запроса запускается, это так и надо?
JOHN_16
Страница официальной справки
Из книги Бизли “Python подробный справочник”
Метод __del__()
вызывается перед уничтожением объекта. Вызов этого метода происходит,
только когда объект нигде больше не используется. Важно заметить, что
инструкция del x всего лишь уменьшает счетчик ссылок на объект и необя-
зательно может приводить к вызову этого метода

Когда происходит уничтожение экземпляра, интер-
претатор сначала отыскивает метод __del__() объекта и вызывает его. На
практике необходимость в определении метода __del__() возникает редко.
Единственное исключение – когда в процессе уничтожения объекта необ-
ходимо выполнить некоторые завершающие действия, например закрыть
файл, разорвать сетевое соединение или освободить другие системные
ресурсы. Однако даже в таких случаях нельзя полностью полагаться на
метод __del__(), потому что нет никаких гарантий, что этот метод будет
вызван при завершении работы интерпретатора. Для этих целей лучше
определить метод, такой как close(), который программа сможет явно ис-
пользовать при завершении.
Иногда для удаления ссылки на объект в программах используется ин-
струкция del. Если в этом случае счетчик ссылок уменьшается до нуля,
вызывается метод __del__(). Однако в общем случае вызов инструкции del
не обязательно приводит к вызову метода __del__().
С уничтожением объектов связана одна малозаметная проблема, которая
обусловлена тем, что не все ситуации, когда должен вызываться метод
__del__(), распознаются циклическим сборщиком мусора (что является
веской причиной не определять метод __del__() без серьезных на то осно-
ваний). Программисты, пришедшие из других языков программирования,
в которых отсутствует механизм автоматического сбора мусора (например,
C++), должны стараться уклониться от стиля программирования с не-
оправданным использованием метода __del__(). Ситуации, когда объявле-
ние метода __del__() может нарушить работу сборщика мусора, возникают
редко…
quaker
А на деле он без запроса запускается, это так и надо?
вы не так поняли. Когда ваша программа закрывается происходит освобождение памяти по средством удаления объектов. И в этот момент у объекта вызывается метод __del__.
Shaman
quaker
Я читал в литературе, что __del__ вызывается по запросу допустим
Выше всё подробно описали.
Ситуация в IDLE сразу после прогона Вашего кода:
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
>>> 
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB