Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2017 22:28:05

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

Зачем писать self.name = name, а после использовать self.name вместо name?

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

Ну вот видите, сами же себе противоречите. Деструктор не освобождает место в памяти, занимаемое объектом. По крайней мере в С++.

4kpt_V
Что Вы в си вцепились? Я же говорю. Определения СИ вообще никак не соосны с ООП.

Во-первых, в С++. С++ и С это два очень разных языка.
Хотите сказать С++ - не ООП язык? Может быть Java и C# тоже не ООП языки?

Провожу параллель с С++ (а так же с другими современными языками), так как это один из популярных ООП языков, в котором реализованы в явном виде как конструкторы так и деструкторы.

4kpt_V
Если я не ошибаюсь, то каноничным с точки зрения создателей ООП был все же SmallTalk. Туда и надо таращиться.

В таком случае спор теряет смысл, т.к. нет эталонного определения конструктора в ООП.



Офлайн

#2 Март 11, 2017 22:29:09

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

Зачем писать self.name = name, а после использовать self.name вместо name?

FishHook
Это не я добавил, это вытекает из определения. Любой метод статический, пока нет ссылки на объект. Поэтому создать объект может только статический метод. Назовем статический метод, который создает новый объект конструктором, и вот вам конструктор, в любом ООП языке.

Фокус в том, что в С++, C#, Java в конструкторе внезапно есть ссылка на объект (this).



Офлайн

#3 Март 11, 2017 22:31:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Зачем писать self.name = name, а после использовать self.name вместо name?

cutwater
Фокус в том, что в С++, C#, Java в конструкторе внезапно есть ссылка на объект (this).
Это ссылка на null, ничто не нарушает моего определения



Офлайн

#4 Март 11, 2017 22:31:38

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Зачем писать self.name = name, а после использовать self.name вместо name?

cutwater
Во-первых, в С++. С++ и С это два очень разных языка.
Это и в третьих тоже. Я в курсе.

Определение дано. Вы его сами зацитировали из Вики. Под него ложиться __init__ питона или нет? И не надо другие языки приводить. Мы опираемся на определение, которые Вы же сами и запостили. Правда после меня, но все равно

Офлайн

#5 Март 11, 2017 22:35:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

Зачем писать self.name = name, а после использовать self.name вместо name?

cutwater
Деструктор не освобождает место в памяти, занимаемое объектом. По крайней мере в С++.
Тогда бы стек переполнялся в больших программах, ведь места бы не хватало. Если, например, стек может вместить 10 чисел, то максимум в программе можно было бы использовать 10 чисел. Но когда срабатывает деструктор 10-го числа, то мы можем поместить на его место 11-ое.



Офлайн

#6 Март 11, 2017 22:38:20

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

Зачем писать self.name = name, а после использовать self.name вместо name?

4kpt_V
Определение дано. Вы его сами зацитировали из Вики. Под него ложиться __init__ питона или нет? И не надо другие языки приводить. Мы опираемся на определение, которые Вы же сами и запостили. Правда после меня, но все равно

По моему мнению ложится, не вижу противоречий. Привожу другие языки для сравнения.

FishHook
Это ссылка на null, ничто не нарушает моего определения

Уж простите, но это самая безумная вещь, которую я когда либо слышал.
Если бы this был ссылкой на null, то ниже приведенный код падал бы с ошибкой NullPointerException.

Java
https://ideone.com/5aTgc0

C++
https://ideone.com/m7X7eG



Отредактировано cutwater (Март 11, 2017 22:40:16)

Офлайн

#7 Март 11, 2017 22:42:55

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Зачем писать self.name = name, а после использовать self.name вместо name?

cutwater
Привожу другие языки для сравнения.
Приведение других языков никак не доказывает.

Не ложиться. Я написал почему. Потому, что __init__ выполняется после создания экземпляра, а конструктор должен выполнятся при создании, т.е. в процессе создания.

Отредактировано 4kpt_V (Март 11, 2017 22:43:23)

Офлайн

#8 Март 11, 2017 22:44:21

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Зачем писать self.name = name, а после использовать self.name вместо name?

cutwater
Если бы this был ссылкой на null, то ниже приведенный код падал бы с ошибкой NullPointerException.
С чего же? Компилятор делает магию, конструктор явно или неявно всегда возвращает ссылку на новый объект, и null становится не нуллом, а этой ссылкой. Как по-вашему вообще работают функции? Возврат значения из функции - это в любом случае замена некой глобальной переменной результатом функции, иначе оно не может работать.



Офлайн

#9 Март 11, 2017 22:46:18

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

Зачем писать self.name = name, а после использовать self.name вместо name?

py.user.next
Тогда бы стек переполнялся в больших программах, ведь места бы не хватало. Если, например, стек может вместить 10 чисел, то максимум в программе можно было бы использовать 10 чисел. Но когда срабатывает деструктор 10-го числа, то мы можем поместить на его место 11-ое.

Я не берусь утверждать что во всех языках поведение одинаковое. Но как минимум для С++ это не так. Деструктор может быть вызван, но занимаемая объектом память, у которого был вызван деструктор, не будет освобождена. Память удаляет оператор delete, delete или любым другим способом, в зависимости от того, как память была аллоцирована.

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



Офлайн

#10 Март 11, 2017 22:55:48

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

Зачем писать self.name = name, а после использовать self.name вместо name?

FishHook
С чего же? Компилятор делает магию, конструктор явно или неявно всегда возвращает ссылку на новый объект, и null становится не нуллом, а этой ссылкой.

> конструктор явно или неявно всегда возвращает ссылку на новый объект

Было бы неплохо увидеть ссылку на источник подтверждающий Ваши слова.

Еще раз, в момет вызова конструктора участок в памяти для объекта уже выделен (по крайней мере могу c уверенностью утверждать для С++), имеется ссылка на этот участок в памяти, которая передается в конструктор неявно (this).

FishHook
Как по-вашему вообще работают функции? Возврат значения из функции - это в любом случае замена некой глобальной переменной результатом функции, иначе оно не может работать.

Это достаточно обширная тема, зависит от конкретной реализации и надеюсь нам не придется в нее углубляться. Надеюсь для вас не будет открытием, что есть функции, которые значение не возвращают.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version