Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2017 22:58:22

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

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

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

Ага. Процедуры. В паскале и делфи они даже определяются по-разному. Вы на мой вопрос так и не ответили.

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

Офлайн

#2 Март 11, 2017 23:04:25

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

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

cutwater
Еще раз, в момет вызова конструктора участок в памяти для объекта уже выделен
Ну да, только его значение не определено
cutwater
Было бы неплохо увидеть ссылку на источник подтверждающий Ваши слова.
Давайте рассуждать. Если функция создания нового объекта возвращает НЕ сслыку на объект и не null, то что она возрзвращает?



Офлайн

#3 Март 11, 2017 23:14:47

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

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

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

Это походит на демагогию.

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

В Python инстанцирование объекта включает в себя неявный вызов метода __init__, который обычно используется для инициализации объекта, на который ссылается первый параметр self. Так же __init__ не возвращает значение. Подобное поведение наблюдается и в других языках программирования.

Быть может следует для начала дать определение “созданного объекта”?



Офлайн

#4 Март 11, 2017 23:19:27

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

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

FishHook
Давайте рассуждать. Если функция создания нового объекта возвращает НЕ сслыку на объект и не null, то что она возрзвращает?

Кто вам сказал, что это функция создания нового объекта? Вы не допускаете, что память под объект может быть выделена еще до вызова этой функции (напр. оператором new или malloc или любым другим способом) и ссылка \ указатель может быть передан функции явно (напр. первым параметром) или неявно (в зависимости от реализации).

Если хотите узнать более подробно, стоит посмотреть на сгенерированный ассемблерный код или код для JVM или MSIL. Но мне сейчас немного лень этим заниматься, будет время расскажу подробнее.



Офлайн

#5 Март 11, 2017 23:25:13

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

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

cutwater
Дело в том, что в различных языках существует процедура инстанцирования объекта, которая включает в себя как выделение памяти для объекта, инициализацию объекта и возврат ссылки на объект. В популярных на сегодняшний день языках конструктор отвечает за инициализацию объекта. При этом он вызывается не явно как часть процесса инстанцирования объекта.

В Python инстанцирование объекта включает в себя неявный вызов метода __init__, который обычно используется для инициализации объекта, на который ссылается первый параметр self. Так же __init__ не возвращает значение. Подобное поведение наблюдается и в других языках программирования.

Быть может следует для начала дать определение “созданного объекта”?

Да все это похоже на демагогию. Как-то так. Возможно объект нельзя считать созданным, пока нет обращения к хотя-бы к одном атрибуту или методу. Вы сами выложили определение и от него отказались.

Офлайн

#6 Март 12, 2017 02:33:11

wi34rd
Зарегистрирован: 2016-10-08
Сообщения: 89
Репутация: +  2  -
Профиль   Отправить e-mail  

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

del

Отредактировано wi34rd (Март 12, 2017 08:36:50)

Офлайн

#7 Март 12, 2017 08:05:42

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

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

wi34rd
Из вики.

Вики увы не самый надежный источник информации. Более того английская и русская вики в мнениях расходтся.

4kpt_V
Да все это похоже на демагогию. Как-то так. Возможно объект нельзя считать созданным, пока нет обращения к хотя-бы к одном атрибуту или методу. Вы сами выложили определение и от него отказались.

Я не отказываюсь от своего определения, скорее мы с Вами его трактуем по разному.


P.S. У меня сейчас нет возможности писать развернутые ответы, отпишусь в понедельник более обстоятельно.



Офлайн

#8 Март 12, 2017 08:36:29

wi34rd
Зарегистрирован: 2016-10-08
Сообщения: 89
Репутация: +  2  -
Профиль   Отправить e-mail  

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

Офлайн

#9 Март 12, 2017 10:46:13

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

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

FishHook
Это ссылка на null, ничто не нарушает моего определения
Да неужто? А как работает placement new C++?
character = reinterpret_cast<Character*>(alives.allocate());
new (character) Character();

Отредактировано Shaman (Март 12, 2017 10:46:31)

Офлайн

#10 Март 12, 2017 22:46:35

Djo0513
Зарегистрирован: 2016-09-02
Сообщения: 92
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Как много внимания уделено моему ответу.



Лучший учитель - это ты сам.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version