Найти - Пользователи
Полная версия: Метод __init__ . Что это за зверь и с чем его едят ???
Начало » Python для новичков » Метод __init__ . Что это за зверь и с чем его едят ???
1
citizen404

Доброго времени суток уважаемые форумчане !
Я только недавно приступил к изучению языка Питон, и скажу сразу, что сам процесс дается мне тяжело, ибо я отношу себя к т.н. хроническим гуманитариям. Начал изучение с книги Э.Мэтиза - “Изучаем Python. Программирование игр, визуализация данных, веб-приложения - 2017” . До определенного момента было более менее понятно, но когда дошел до ООП, т.е. объектов и классов решил переключиться на “A byte of Python”, однако же все равно не могу до конца осознать/переварить даже базовые концепции.
Вот взять хотя бы пример со стр. 104 книги “A byte of Python” :

1. class Person:
2. def __init__(self, name):
3. self.name = name
4. def sayHi(self):
5. print('Привет! Меня зовут', self.name)
6.
7. p = Person('Swaroop')
8. p.sayHi()

Я не могу понять, какую роль/функцию/назначение играет метод __init__ .
Как позже вызвать данную функцию, если у нее нет имени, или в данном случае именем функции выступает метод __init__ ???
Или она вообще не вызывается ? Объясните на пальцах в каких случаях нужно использовать __init__ , ну, т.е. мы же ведь могли с таким же успехом просто указать рандомное имя myFunc и в скобках указать то же самое myFunc(self, name) . В чем принципиальная разница между двумя этими способами ?

Зачем указывается параметр self ? О чем это нам говорит ?

И особенно не понятна строка №3 - self.name = name ??? Для чего эта манипуляция ? Что эта запись по сути вообще выполняет ?
Из объяснения в книге я мало что понял :
"Далее мы создаём новое поле с именем name. Обратите внимание, что это две разные переменные, даже несмотря на то, что
они обе названы name (прим. О каких именно двух разных переменных идет речь ??? Я прикрепил файл, где цветами выделил мое понимание этого вопроса. Но если так, зачем переменной name из строки №2 присваивать значение локальной переменой name из строки №3 ? ) . Это не проблема, так как точка в выражении self.name обозначает, что существует нечто с именем «name», являющееся частью объекта «self», и другое name – локальная переменная. Поскольку мы в явном виде
указываем, к которому имени мы обращаемся, путаницы не возникнет."

Если это возможно, прошу дать исчерпывающий ответ более менее простым языком. Также буду благодарен за ссылки на учебные материалы по Питону для чайников.

з.ы. Прошу прощения за допущенные мною вольности и неточности в изложении вопроса и заранее благодарю всех кто откликнется.
py.user.next
  
>>> class Person:
...     def __init__(self, name):
...         self.name = name
...     def sayHi(self):
...         print('Привет! Меня зовут', self.name)
... 
>>> person1 = Person('Tanya')
>>> person2 = Person('Manya')
>>> 
>>> person1.sayHi()
Привет! Меня зовут Tanya
>>> person2.sayHi()
Привет! Меня зовут Manya
>>> person1.sayHi()
Привет! Меня зовут Tanya
>>> person2.sayHi()
Привет! Меня зовут Manya
>>>

citizen404
Я не могу понять, какую роль/функцию/назначение играет метод __init__ .
Инициализирует экземпляр класса. В данном случае сохраняет внутри экземпляра (как в коробочке) переданное при создании экземпляра имя. Потом это сохранённое имя используется методом sayHi(), который получает доступ в коробочку через свой первый аргумент - self.

citizen404
Объясните на пальцах в каких случаях нужно использовать __init__
Когда что-то передаёшь при создании экземпляра, чтобы оно сохранилось внутри экземпляра.

citizen404
Зачем указывается параметр self ? О чем это нам говорит ?
Экземпляр при вызове методов у него передаёт сам себя в свой метод первым аргументом. Так метод может обращаться внутрь экземпляра, чтобы сохранять в него что-то или доставать из него что-то.

citizen404
И особенно не понятна строка №3 - self.name = name ??? Для чего эта манипуляция ? Что эта запись по сути вообще выполняет ?
Внутри экземпляра создаёт переменную name в которую записывает значение, переданное внутрь метода через параметр name. Просто они именуются одинаково, но могли бы и по разному именоваться. Но так как у них разные пространства имён, то эти одинаковые имена никак не конфликтуют, так как считаются разными.

Тебе нужно понять различие между классом и экземпляром класса. Класс - это такое описание, а экземпляры - это объекты, создаваемые по этому описанию. Класс для всех экзепляров один и тот же, а экземпляры все разные, поэтому каждый экземпляр класса Person может хранить своё собственное имя человека.
citizen404
Cпасибо огромное! Благодаря Вашим пояснениям, потихоньку начинаю осмысливать полученную информацию.

py.user.next
Тебе нужно понять различие между классом и экземпляром класса.
Да с этим как раз у меня вроде бы нет проблем. Я для себя понял, что класс - это как бы прообраз/чертеж некоего объекта, а экземпляр - уже сам готовый объект, коих может быть сколь угодно много.

Ниже прилагаю скриншот с двумя примерами создания класса, а также свои комментарии, то как я понимаю строки кода на данном этапе. Хочу убедиться, что все правильно интерпретировал. Также есть строки со знаками ‘?’, где я не уверен как правильно охарактеризовать инструкцию. Буду признателен за уточнения и поправки к моим комментариям.
Скриншот
py.user.next
__init__() - это не конструктор, а инициализатор. Конструктор - это __new__() + __init__().

Класс определяется без круглых скобок
  
class A:
    pass

citizen404
Также есть строки со знаками ‘?’, где я не уверен как правильно охарактеризовать инструкцию.
Заголовок класса, заголовок метода __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