Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2012 21:56:57

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

fata1ex
vault, вы ошиблись. Деструктор вызывается как раз при удалении объекта. И это вполне очевидно, если подумать. Не говоря уже о том, что об этом написано в документации и в огромной куче других мест )

Метод __del__ вызывается при удалении последней ссылки на объект, по идее. А при удалении произвольного представителя - нет.

Офлайн

#2 Июнь 22, 2012 21:58:52

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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

Офлайн

#3 Июнь 22, 2012 22:03:11

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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



Офлайн

#4 Июнь 22, 2012 22:03:37

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

Я, пожалуй, неточно выразился. Имел ввиду вот что:

class undead:
    def __del__ (self):
        print "I'm dead"
c2 = undead()
c1 = c2
del c2
del c1

Это выведет надпись только один раз.

Офлайн

#5 Июнь 22, 2012 22:05:26

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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

Ну так, чисто для приличия, почтить память погибшего :-) Просто питон мне показался настолько логичным языком, что он работал так, как я от него ожидал. А эти 2 момента - те случаи, когда мои ожидания нарушались)

Офлайн

#6 Июнь 22, 2012 22:14:15

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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

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



Отредактировано Soteric (Июнь 22, 2012 22:14:46)

Офлайн

#7 Июнь 22, 2012 22:27:49

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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

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

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

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

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

Офлайн

#8 Июнь 22, 2012 22:42:18

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

vault, об этом обо всём вполне однозначно сказано в документации. А значит результат работы будет предсказуемым для всех, кто удосужился её прочитать.

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

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



Отредактировано fata1ex (Июнь 22, 2012 22:44:13)

Офлайн

#9 Июнь 22, 2012 22:49:00

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

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

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

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

Документацию по питону прочитал уже после этих экспериментов с деструкторами.

Офлайн

#10 Июнь 22, 2012 22:55:55

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Не могу разобраться - почему работает неправильно.

vault
питон отказался от динамического приведения типов
И давно ли? :)

Кстати, кто такие “произвольные представители” объекта? Это типа парламента? :)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version