Найти - Пользователи
Полная версия: Зачем писать self.name = name, а после использовать self.name вместо name?
Начало » Python для новичков » Зачем писать self.name = name, а после использовать self.name вместо name?
1 2 3 4 5 6 7 8 9 10
cutwater
Уважаемые FishHook и 4kpt_V, предлагаю вам проявлять уважение друг к другу и к иным участникам форума и не выходить за рамки.

4kpt_V, не мог бы ты аргументировать почему __init__ по твоему мнению не является конструктором. А так же ответить на вопрос в чем принципиальное отличие __init__ в Python от конструкторах в языках C++, C# или Java.
4kpt_V
cutwater
Где Вы обнаружили выход “за рамки”. Это раз. Во-вторых. Ну как-бы я Вас давно уже тут не видел. Какими ветрами?
FishHook
cutwater
Уважаемый cutwater, __init__ не является конструктором в питоне, потому что он не создает объект. Он инициализирует УЖЕ созданный объект. Поэтому он никак не может быть конструктором. А вот метод __new__ создает объект (он его вообще возвращает) поэтому, как мне кажется, это есть конструктор.
FishHook
cutwater
Уважаемые FishHook и 4kpt_V, предлагаю вам проявлять уважение друг к другу и к иным участникам форума и не выходить за рамки.
Да мы просто срёмся
4kpt_V
FishHook
Кто? Побойся бога. Вечерний такой спич…
cutwater
4kpt_V
cutwaterГде Вы обнаружили выход “за рамки”. Это раз. Во-вторых. Ну как-бы я Вас давно уже тут не видел. Какими ветрами?

Периодически почитываю форум, но к сожалению пишу сюда крайне редко. Более сдержанная в эмоциях дискуссия была бы предпочтительней в рамках обсуждения за рамками раздела “Флейм”, но это лишь мое личное мнение.
4kpt_V
cutwater
Спасибо. Учтем. Но как-то вяло было. Мы оживили
cutwater
FishHook
А вот метод __new__ создает объект (он его вообще возвращает) поэтому, как мне кажется, это есть конструктор.

Не могу согласиться с этим утверждением.

Проводя параллель между языком Python и такими популярными языками как Java, C#, C++, возникает закономерный вопрос. В этих языках конструкторы есть, но значение они не возвращают.

Было бы неплохо для начала дать определение созданию объекта. Поскольку если к примеру говорить о С++, то объект класса создается при помощи оператора new, который выделяет память для объекта и вызывает конструктор класса (т.е. выполняет инициализацию объекта). При чем память может быть выделена любым другим механизмом, а объект может быть инициализирован оператором placement new, который по факту вызывает конструктор класса над уже аллоцированным участком памяти.

Соответственно как мне кажется наиболее подходящим под задачи конструктора является __init__, хотя никто не запрещает инициализировать объект в методе __new__.
4kpt_V
cutwater
Есть же классическое определение конструктора из ООП. Под это определение __init__ никак не ложиться. А терминология других языков все же и интересна, но все же не является “каноничной”. Поэтом если приводить тот же СИ, то там переменные-члены, если я не ошибаюсь. По ООП это все же атрибуты, т.е. терминология СИ ну никак не может быть использована как основа для сравнения.
py.user.next
Конструкторы в питоне - это list(), dict() и так далее. А __init__() можно вызывать много раз, но он не создаёт объект ни разу. Создание объекта - это выделение памяти и назначение ссылки, через которую можно обращаться к объекту.
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