Найти - Пользователи
Полная версия: Не могу разобраться - почему работает неправильно.
Начало » Python для новичков » Не могу разобраться - почему работает неправильно.
1 2 3 4 5 6
vault
fata1ex
vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )

Метод __del__ вызывается при удалении последней ссылки на объект, по идее. А при удалении произвольного представителя - нет.
vault
То есть метод не будет вызван, если на экземпляр класса существует хотя бы одна ссылка.
Soteric
Почему он должен быть вызван? Если на него ссылаются, значит он кому-то нужен.
vault
Я, пожалуй, неточно выразился. Имел ввиду вот что:
class undead:
    def __del__ (self):
        print "I'm dead"
c2 = undead()
c1 = c2
del c2
del c1

Это выведет надпись только один раз.
vault
Soteric
Почему он должен быть вызван? Если на него ссылаются, значит он кому-то нужен.

Ну так, чисто для приличия, почтить память погибшего :-) Просто питон мне показался настолько логичным языком, что он работал так, как я от него ожидал. А эти 2 момента - те случаи, когда мои ожидания нарушались)
Soteric
Все логично. Есть один объект и на него две ссылки: c1 и c2. При присвоении c1 = c2 не происходит копирования объекта, просто одна переменная начинает ссылаться на то же самое значение что и другая. Командой del вы удаляете ссылку, а не сам объект. Когда ссылок не остается, объект удаляется сборщиком мусора. Что здесь выглядит нелогичным?

В каком языке происходит так как вы ожидаете?
vault
Soteric
Все логично. Есть один объект и на него две ссылки: c1 и c2. При присвоении c1 = c2 не происходит копирования объекта, просто одна переменная начинает ссылаться на то же самое значение что и другая. Командой del вы удаляете ссылку, а не сам объект. Когда ссылок не остается, объект удаляется сборщиком мусора. Что здесь выглядит нелогичным?

В каком языке происходит так как вы ожидаете?

А вот что тут нелогично: ОБЕ переменные ССЫЛАЮТСЯ на один и тот же объект. Но если удалить одну, то метод не вызовется, а если удалить другую - вызовется, потому что удалится объект. Но, собственно, указание на удаление объекта дает не пользователь, а сам интерпретатор, считающий тихо себе ссылки. В таком случае использование деструкторов становится менее предсказуемым, а, значит, несколько противоречащим идее питона, как я ее понимаю.

Ну, например C++. Там удаляешь объект - вызывается деструктор. Удаляешь ссылку - не вызывается деструктор. Все четко и логично. А тут все зависит от внутреннего параметра, который, конечно, можно вполне себе выяснить, но это, имхо не очень правильно. Питон прекрасен именно тем, что на нем можно кодить, не особо задумываясь, в отличие от С. А считать количество ссылок на объект, чтобы предугадать результат - суть задумываться)

Повторяюсь: это лично мое мнение, основанное на двух предположениях: 1) Идеология языка питон подразумевает, что действия вызывают наиболее предсказуемый результат. 2) В существующем ключе, использование деструкторов не особо предсказуемо, а, значит, небезопасно.
fata1ex
vault, об этом обо всём вполне однозначно сказано в документации. А значит результат работы будет предсказуемым для всех, кто удосужился её прочитать.

Метод __del__ вызывается при удалении последней ссылки на объект, по идее.
А вот такие фразы говорят, что вы документацию не читали. Так какие претензии?

vault
Ну, например C++. Там удаляешь объект - вызывается деструктор. Удаляешь ссылку - не вызывается деструктор. Все четко и логично.
Бгг. Давайте на спор посмотрим все вместе, где больше ереси: в питоне или в C++? Разумеется, деструкторы в С++ работают совершенно по-другому, потому что язык работает совершенно по-другому.
vault
fata1ex
Бгг. Давайте на спор посмотрим все вместе, где больше ереси в питоне или в C++? Разумеется деструкторы в С++ работыю совершенно по-другому, потому что язык работает совершенно по-другому.

В С++ ереси нет. Как и в С. Он вполне логичный язык. Только писать на нем трудно - просто потому что легко посадить кучу ошибок, которые вслывут внезапно во время работы программы. И это несмотря на наличие документации)

На мой взгляд, раз уж питон отказался от динамического приведения типов (которое меня не напрягает в том же пхп), для того, чтобы были предсказуемы программы, то такие подлянки - как и с сабжевым примером - ну, уж совсем неожидаемы мной были.

Документацию по питону прочитал уже после этих экспериментов с деструкторами.
fata1ex
vault
питон отказался от динамического приведения типов
И давно ли? :)

Кстати, кто такие “произвольные представители” объекта? Это типа парламента? :)
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