Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2013 12:01:40

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Простите, это так мило за вами наблюдать. Но все же позвольте вставить свои 5 копеек.

__del__ это НЕ деструктор. Точне хоть в документации его так и называют, это не деструктор в привычном его понимании.

Во-первых время вызова этого метода не определено. Он может быть вызван как сразу после того как будет уничтожена последняя ссылка на объект, так и несколько позже. А может быть вообще не вызван.

It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
http://docs.python.org/3/reference/datamodel.html?highlight=__del__#object.__del__

Поэтому использовать метод __del__ для подчистки ресурсов категорически нельзя. Кроме этого с методом __del__ связано еще несколько нюансов с управлением памятью. И без крайней на то необходимости, кроме случая когда Вы точно уверены, что этот метод вам нужен, его обычно не используют.

Если необходимо ограничить время существования объекта и подчистить ресурсы за ним, лучше использовать context managers (конструкция with) или явно вызывать метод когда объект более не нужен.



Отредактировано cutwater (Март 2, 2013 12:03:20)

Офлайн

#2 Март 2, 2013 16:20:42

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

cutwater
Если я не ошибаюсь Вы уже об этом писали в блоге по вопросам with и garbage collection. Кроме того, как говориться в правилах “Явное лучше неявного…”.
P.S. Сказали, что пять копеек, а насыпали как на рубль :)
P.S.S. На самом деле здесь как проблема так и задача была иного характера, только косвенно связанноя с деструктором… Проблемой было использование неподходящего метода виджета.



Отредактировано 4kpt (Март 2, 2013 16:37:07)

Офлайн

#3 Март 2, 2013 16:35:19

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Dwarf
Последний раз говорю, что не буду отвечать, если тему не перенесете или не продублируете в GUI.



Офлайн

#4 Март 2, 2013 16:48:36

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

4kpt, заканчивайте с Вашей политикой переноса или “дублирования” тем.
Если надо перенести просите модераторов. И за пропаганду дублирования тем - предупреждение! Это уже далеко не первый раз.

По поводу ответа, я всю тему не читал. Я лишь обратил внимание на явное заблуждение товарища ТС по поводу __del__ и непонимания как он работает.



Отредактировано cutwater (Март 2, 2013 16:50:03)

Офлайн

#5 Март 2, 2013 16:52:10

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Не знал, что темы нельзя дублировать…
Впредь не повторится.

P.S. Модераторов просить не буду. Это и так должно выполняться :)



Офлайн

#6 Март 2, 2013 17:22:05

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Темы дублировать нежелательно. Если необходимо или по решению модератора тема может быть перемещена в соответствующий раздел.



Офлайн

#7 Март 2, 2013 19:20:12

Dwarf
От:
Зарегистрирован: 2011-05-09
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

cutwater

It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.
Тогда такой вопрос: при своём завершении интерпретатор обязательно сам убивает все объекты или же какие-то (а точнее занимаемую ими память) он может оставить на откуп операционной системе?
Из вашей цитаты это непонятно.



Офлайн

#8 Март 2, 2013 23:11:46

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Как бы объект и занимаемая им память совершенно не связанные между собой понятия. При чем операционная система по завершении процесса освобождает занимаемую им память.

А вот вызывать код, который корректно освободит ресурсы, запишет состояние и т.п. нужно ручками. И полагаться тут на финализаторы (деструкторы) что в C#, Java, Python нельзя.
Тут поведение отлично от С++.



Офлайн

#9 Март 2, 2013 23:17:00

Dwarf
От:
Зарегистрирован: 2011-05-09
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Как бы объект и занимаемая им память совершенно не связанные между собой понятия.
Но они же взаимосвязаны? Есть объект -> значит есть занятая им память. Нет объекта - нет памяти. Разве нет?

При чем операционная система по завершении процесса освобождает занимаемую им память.
Это я знаю.

А вот вызывать код, который корректно освободит ресурсы, запишет состояние и т.п. нужно ручками.
То есть это нормальное поведение в Python, когда в некоторых условиях деструктор так никогда не будет вызван? Т.е. это не баг, вот что я хочу понять.



Офлайн

#10 Март 3, 2013 03:45:15

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Не вызывается деструктор самописного класса при работе с Tkinter

Dwarf
То есть это нормальное поведение в Python, когда в некоторых условиях деструктор так никогда не будет вызван? Т.е. это не баг, вот что я хочу понять.

Документация вполне определенно описывает данное поведение. Так что это никакой не баг.

Dwarf
Но они же взаимосвязаны? Есть объект -> значит есть занятая им память. Нет объекта - нет памяти. Разве нет?

Сейчас мы уйдем в дебри. Мне не ясна формулировка “нет памяти”. Конкретизируйте.
Я немного не правильно сформулировал мысль, сказав что объект и память между собой не связаны.
Но все таки давайте вернемся к первоначальному вопросу о том что “интерпретатор убивает объекты” и “может оставить на откуп системе”. Поясните что вы имели ввиду.



Отредактировано cutwater (Март 3, 2013 03:53:29)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version