Форум сайта python.su
19
Простите, это так мило за вами наблюдать. Но все же позвольте вставить свои 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__
Отредактировано cutwater (Март 2, 2013 12:03:20)
Офлайн
63
cutwater
Если я не ошибаюсь Вы уже об этом писали в блоге по вопросам with и garbage collection. Кроме того, как говориться в правилах “Явное лучше неявного…”.
P.S. Сказали, что пять копеек, а насыпали как на рубль :)
P.S.S. На самом деле здесь как проблема так и задача была иного характера, только косвенно связанноя с деструктором… Проблемой было использование неподходящего метода виджета.
Отредактировано 4kpt (Март 2, 2013 16:37:07)
Офлайн
63
Dwarf
Последний раз говорю, что не буду отвечать, если тему не перенесете или не продублируете в GUI.
Офлайн
19
4kpt, заканчивайте с Вашей политикой переноса или “дублирования” тем.
Если надо перенести просите модераторов. И за пропаганду дублирования тем - предупреждение! Это уже далеко не первый раз.
По поводу ответа, я всю тему не читал. Я лишь обратил внимание на явное заблуждение товарища ТС по поводу __del__ и непонимания как он работает.
Отредактировано cutwater (Март 2, 2013 16:50:03)
Офлайн
63
Не знал, что темы нельзя дублировать…
Впредь не повторится.
P.S. Модераторов просить не буду. Это и так должно выполняться :)
Офлайн
19
Темы дублировать нежелательно. Если необходимо или по решению модератора тема может быть перемещена в соответствующий раздел.
Офлайн
0
cutwater
It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits.Тогда такой вопрос: при своём завершении интерпретатор обязательно сам убивает все объекты или же какие-то (а точнее занимаемую ими память) он может оставить на откуп операционной системе?
Офлайн
19
Как бы объект и занимаемая им память совершенно не связанные между собой понятия. При чем операционная система по завершении процесса освобождает занимаемую им память.
А вот вызывать код, который корректно освободит ресурсы, запишет состояние и т.п. нужно ручками. И полагаться тут на финализаторы (деструкторы) что в C#, Java, Python нельзя.
Тут поведение отлично от С++.
Офлайн
0
Как бы объект и занимаемая им память совершенно не связанные между собой понятия.Но они же взаимосвязаны? Есть объект -> значит есть занятая им память. Нет объекта - нет памяти. Разве нет?
При чем операционная система по завершении процесса освобождает занимаемую им память.Это я знаю.
А вот вызывать код, который корректно освободит ресурсы, запишет состояние и т.п. нужно ручками.То есть это нормальное поведение в Python, когда в некоторых условиях деструктор так никогда не будет вызван? Т.е. это не баг, вот что я хочу понять.
Офлайн
19
Dwarf
То есть это нормальное поведение в Python, когда в некоторых условиях деструктор так никогда не будет вызван? Т.е. это не баг, вот что я хочу понять.
Dwarf
Но они же взаимосвязаны? Есть объект -> значит есть занятая им память. Нет объекта - нет памяти. Разве нет?
Отредактировано cutwater (Март 3, 2013 03:53:29)
Офлайн