Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2015 20:36:32

quaker
Зарегистрирован: 2013-07-13
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

использование метода __del__

Почему метод __del__ сразу же вызывается

class robot:
    def __init__(self, name):
        self.name=name
    def __del__(self):
        print('{0} уничтожается!'.format(self.name))
obj=robot('namee')
Вывод:
namee уничтожается!



Использую Python 3 + komodo edit )

Офлайн

#2 Янв. 3, 2015 22:54:12

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

использование метода __del__

Сразу после чего?

Офлайн

#3 Янв. 3, 2015 23:19:49

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

использование метода __del__

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)



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Янв. 3, 2015 23:20:09)

Офлайн

#4 Янв. 5, 2015 07:48:38

quaker
Зарегистрирован: 2013-07-13
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

использование метода __del__

Shaman
Сразу после чего?
Я читал в литературе, что __del__ вызывается по запросу допустим
del obj
А на деле он без запроса запускается, это так и надо?



Использую Python 3 + komodo edit )

Отредактировано quaker (Янв. 5, 2015 07:49:50)

Офлайн

#5 Янв. 5, 2015 08:44:42

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

использование метода __del__

Страница официальной справки
Из книги Бизли “Python подробный справочник”

Метод __del__()
вызывается перед уничтожением объекта. Вызов этого метода происходит,
только когда объект нигде больше не используется. Важно заметить, что
инструкция del x всего лишь уменьшает счетчик ссылок на объект и необя-
зательно может приводить к вызову этого метода

Когда происходит уничтожение экземпляра, интер-
претатор сначала отыскивает метод __del__() объекта и вызывает его. На
практике необходимость в определении метода __del__() возникает редко.
Единственное исключение – когда в процессе уничтожения объекта необ-
ходимо выполнить некоторые завершающие действия, например закрыть
файл, разорвать сетевое соединение или освободить другие системные
ресурсы. Однако даже в таких случаях нельзя полностью полагаться на
метод __del__(), потому что нет никаких гарантий, что этот метод будет
вызван при завершении работы интерпретатора. Для этих целей лучше
определить метод, такой как close(), который программа сможет явно ис-
пользовать при завершении.
Иногда для удаления ссылки на объект в программах используется ин-
струкция del. Если в этом случае счетчик ссылок уменьшается до нуля,
вызывается метод __del__(). Однако в общем случае вызов инструкции del
не обязательно приводит к вызову метода __del__().
С уничтожением объектов связана одна малозаметная проблема, которая
обусловлена тем, что не все ситуации, когда должен вызываться метод
__del__(), распознаются циклическим сборщиком мусора (что является
веской причиной не определять метод __del__() без серьезных на то осно-
ваний). Программисты, пришедшие из других языков программирования,
в которых отсутствует механизм автоматического сбора мусора (например,
C++), должны стараться уклониться от стиля программирования с не-
оправданным использованием метода __del__(). Ситуации, когда объявле-
ние метода __del__() может нарушить работу сборщика мусора, возникают
редко…
quaker
А на деле он без запроса запускается, это так и надо?
вы не так поняли. Когда ваша программа закрывается происходит освобождение памяти по средством удаления объектов. И в этот момент у объекта вызывается метод __del__.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Янв. 5, 2015 11:01:05

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

использование метода __del__

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
>>> 

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version