Найти - Пользователи
Полная версия: Не вызывается деструктор самописного класса при работе с Tkinter
Начало » Python для новичков » Не вызывается деструктор самописного класса при работе с Tkinter
1 2 3 4
cutwater
Простите, это так мило за вами наблюдать. Но все же позвольте вставить свои 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) или явно вызывать метод когда объект более не нужен.
4kpt
cutwater
Если я не ошибаюсь Вы уже об этом писали в блоге по вопросам with и garbage collection. Кроме того, как говориться в правилах “Явное лучше неявного…”.
P.S. Сказали, что пять копеек, а насыпали как на рубль :)
P.S.S. На самом деле здесь как проблема так и задача была иного характера, только косвенно связанноя с деструктором… Проблемой было использование неподходящего метода виджета.
4kpt
Dwarf
Последний раз говорю, что не буду отвечать, если тему не перенесете или не продублируете в GUI.
cutwater
4kpt, заканчивайте с Вашей политикой переноса или “дублирования” тем.
Если надо перенести просите модераторов. И за пропаганду дублирования тем - предупреждение! Это уже далеко не первый раз.

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

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

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

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

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

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

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

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