Найти - Пользователи
Полная версия: Зачем писать self.name = name, а после использовать self.name вместо name?
Начало » Python для новичков » Зачем писать self.name = name, а после использовать self.name вместо name?
1 2 3 4 5 6 7 8 9 10
4kpt_V
Djo0513
Ваш ответ тут не при чем. Просто это такая слегка холиварная тема. Например, если Вы спросите что лучше джанга или фласк, то срач будет не меньше
ZZZ
Ого! Вот это я пропустил срачик!
Слушайте, а если принять, что __init__, это конструктор, то что же такое __new__? Конструктор конструктора? О! Знаю! Создатель! Он же Бог. Как-то мне не по себе от таких материй в программировании…
Shaman
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
Shaman, как ни странно, питон принёс кое что новое… Просто не в этом месте. :-)
Но всё же, мне кажется, что в разговорной речи, для __init__ правильно использовать “инициализатор”, а для __new__ — “конструктор”. Но я знаю, что на сей счёт существует больше одного мнения.
ZZZ
Для меня, кстати, в своё время было открытием, что __init__ не из __new__ вызывается. Кто-нить знает, почему так сделали?
wi34rd
Я же кинул ссылку, там понятно написано, что __new__ - это распределитель, а __init__ - инициализатор, а вместе они составляют конструктор <ClassName>(). __new__ создает экземпляр и передает его в __init__ тот его инициализирует. Спор напоминает тот, в котором ученые обсуждали является ли свет потоком частиц или волной.
ZZZ
wi34rd, если я в разговоре скажу, что “надо использовать распределитель” (или даже “аллокатор”), то меня, думаю, не поймут. А вот “конструктор” понимают все.
Shaman
Задачей конструктора издревле была инициализация объектов.
Проще всего считать использование термина “конструктор” в рамках языка Python особым случаем. Я так и делаю )
cutwater
ZZZ
Но всё же, мне кажется, что в разговорной речи, для __init__ правильно использовать “инициализатор”, а для __new__ — “конструктор”. Но я знаю, что на сей счёт существует больше одного мнения.

Почему это правильно? Ведь

Shaman
Задачей конструктора издревле была инициализация объектов.
wi34rd
ZZZ, в зависимости от контекста я или подумаю на <имя класса>(), или на __init__(), но никак не на __new__().
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