4kpt_V
Март 12, 2017 22:53:49
Djo0513Ваш ответ тут не при чем. Просто это такая слегка холиварная тема. Например, если Вы спросите что лучше джанга или фласк, то срач будет не меньше
ZZZ
Март 12, 2017 23:59:25
Ого! Вот это я пропустил срачик!
Слушайте, а если принять, что __init__, это конструктор, то что же такое __new__? Конструктор конструктора? О! Знаю! Создатель! Он же Бог. Как-то мне не по себе от таких материй в программировании…
Shaman
Март 13, 2017 00:07:41
ZZZ
если принять, что __init__, это конструктор, то что же такое __new__?
Не так важно как оно называется, а важно, что Питон не привнёс тут ничего нового.
#include <cstddef>
class Test
{
int member;
public:
Test()
{
member = 1;
}
void* operator new(size_t size)
{
return nullptr;
}
};
int main()
{
auto var = new Test();
}
ZZZ
Март 13, 2017 00:10:46
Shaman, как ни странно, питон принёс кое что новое… Просто не в этом месте. :-)
Но всё же, мне кажется, что в разговорной речи, для __init__ правильно использовать “инициализатор”, а для __new__ — “конструктор”. Но я знаю, что на сей счёт существует больше одного мнения.
ZZZ
Март 13, 2017 00:12:10
Для меня, кстати, в своё время было открытием, что __init__ не из __new__ вызывается. Кто-нить знает, почему так сделали?
wi34rd
Март 13, 2017 01:18:42
Я же кинул ссылку, там понятно написано, что __new__ - это распределитель, а __init__ - инициализатор, а вместе они составляют конструктор <ClassName>(). __new__ создает экземпляр и передает его в __init__ тот его инициализирует. Спор напоминает тот, в котором ученые обсуждали является ли свет потоком частиц или волной.
ZZZ
Март 13, 2017 09:33:01
wi34rd, если я в разговоре скажу, что “надо использовать распределитель” (или даже “аллокатор”), то меня, думаю, не поймут. А вот “конструктор” понимают все.
Shaman
Март 13, 2017 09:38:31
Задачей конструктора издревле была инициализация объектов.
Проще всего считать использование термина “конструктор” в рамках языка Python особым случаем. Я так и делаю )
cutwater
Март 13, 2017 11:29:27
ZZZ
Но всё же, мне кажется, что в разговорной речи, для __init__ правильно использовать “инициализатор”, а для __new__ — “конструктор”. Но я знаю, что на сей счёт существует больше одного мнения.
Почему это правильно? Ведь
Shaman
Задачей конструктора издревле была инициализация объектов.
wi34rd
Март 13, 2017 11:59:02
ZZZ, в зависимости от контекста я или подумаю на <имя класса>(), или на __init__(), но никак не на __new__().