Уведомления

Группа в Telegram: @pythonsu

#1 Март 11, 2017 21:45:02

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

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

py.user.next
Конструкторы в питоне - это list(), dict()
В литературе их чаще всего называют фабриками базовых типов, если я не ошибаюсь. Могу точно глянуть.

Офлайн

#2 Март 11, 2017 21:51:03

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

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

py.user.next, приведите пожалуйста ссылку на источник, который утверждает, что конструктор должен создавать объект.

В объектно-ориентированном программировании конструктор класса (от англ. constructor) — специальный блок инструкций, вызываемый при создании объекта.
Wikipedia

A constructor is a kind of member function that initializes an instance of its class. A constructor has the same name as the class and no return value.
MSDN



Офлайн

#3 Март 11, 2017 21:53:51

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

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

Метод __init__ вызывается сразу после создания экземпляра класса.

Офлайн

#4 Март 11, 2017 21:54:19

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

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

cutwater
риведите пожалуйста ссылку на источник, который утверждает, что конструктор должен создавать объект

https://docs.python.org/3/library/stdtypes.html#list
The constructor builds a list whose items are the same and in the same order as iterable‘s items.

https://en.wikipedia.org/wiki/Constructor_%28object-oriented_programming%29
In class-based object-oriented programming, a constructor (abbreviation: ctor) in a class is a special type of subroutine called to create an object. It prepares the new object for use, often accepting arguments that the constructor uses to set required member variables.

Memory organization

In Java, C# and VB .NET the constructor creates objects in a special memory structure called heap for reference types. Value types (such as int, double etc.), are created in a sequential structure called stack.

И для конструктора есть обратная функция - деструктор. А что делает деструктор? Удаляет объект.



Отредактировано py.user.next (Март 11, 2017 22:15:56)

Офлайн

#5 Март 11, 2017 21:55:03

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

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

cutwater
Поскольку если к примеру говорить о С++, то объект класса создается при помощи оператора new, который выделяет память для объекта
Ну да, вы правы. И именно __new__ принимая данные для создания нового объекта является конструктором.



Офлайн

#6 Март 11, 2017 21:57:16

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

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

cutwater
должен создавать объект.
ИМХО, конструктор именно статический метод, создающий объект. В Каком ООП ЯП это не так?



Офлайн

#7 Март 11, 2017 22:13:00

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

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

py.user.next
И для конструктора есть обратная функция - деструктор. А что делает деструктор? Удаляет объект.

Что подразумевается под удалением объекта? Если ваше понимание удаления объекта включает в себя освобождение занимаемой им памяти, то Ваше утверждение не верно, как минимум для С++.

In object-oriented programming, a destructor (dtor) is a method which is automatically invoked when the object is destroyed.
Wikipedia
Конкретно здесь сказано, что деструктор автоматически вызывается во время удаления объекта. Что несколько противоречит утверждению “Деструктор удаляет объект”.

FishHook
ИМХО, конструктор именно статический метод, создающий объект. В Каком ООП ЯП это не так?

Вау, Вы уже добавили понятие “статический” в определение конструктора. Встречный вопрос, в каком языке это так?

В C++, Java, C# это не так: конструктор не является статическим, не выделяет память, не возвращает значение (созданный объект). Во всех выше перечисленных языках конструкторы во время вызова имеют ссылку \ указатель на существующий объект (this).

Приведите принципиальные отличия между конструкторами в С++, Java, C# и методом __init__ в Python.



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

Офлайн

#8 Март 11, 2017 22:16:31

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

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

cutwater
Что Вы в си вцепились? Я же говорю. Определения СИ вообще никак не соосны с ООП. Там народ что хочет то так и называет. Если я не ошибаюсь, то каноничным с точки зрения создателей ООП был все же SmallTalk. Туда и надо таращиться. Но вот лень. Ибо помер он давно

Офлайн

#9 Март 11, 2017 22:19:59

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

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

cutwater
Что подразумевается под удалением объекта? Если ваше понимание удаления объекта включает в себя освобождение занимаемой им памяти, то Ваше утверждение не верно, как минимум для С++.
Освобождается место в памяти, которое он занимает и удаляется ссылка из ссылочной таблицы. В питоне оператор del это делает. del отвязывает имя от ссылки на объект, затем сборщик мусора потом, когда будет удобное время, находит этот объект, к которому никто не обращается нигде, освобождает память и удаляет ссылку.



Отредактировано py.user.next (Март 11, 2017 22:22:48)

Офлайн

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

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

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

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version