Уведомления

Группа в Telegram: @pythonsu

#1 Май 14, 2017 15:34:00

citizen404
Зарегистрирован: 2017-05-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __init__ . Что это за зверь и с чем его едят ???


Доброго времени суток уважаемые форумчане !
Я только недавно приступил к изучению языка Питон, и скажу сразу, что сам процесс дается мне тяжело, ибо я отношу себя к т.н. хроническим гуманитариям. Начал изучение с книги Э.Мэтиза - “Изучаем 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 – локальная переменная. Поскольку мы в явном виде
указываем, к которому имени мы обращаемся, путаницы не возникнет."

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

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

Прикреплённый файлы:
attachment Screenshot_1.png (15,2 KБ)

Офлайн

#2 Май 14, 2017 16:14:38

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

Метод __init__ . Что это за зверь и с чем его едят ???

  
>>> 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 может хранить своё собственное имя человека.



Отредактировано py.user.next (Май 14, 2017 16:16:54)

Офлайн

#3 Май 16, 2017 11:19:45

citizen404
Зарегистрирован: 2017-05-14
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Метод __init__ . Что это за зверь и с чем его едят ???

Cпасибо огромное! Благодаря Вашим пояснениям, потихоньку начинаю осмысливать полученную информацию.

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

Ниже прилагаю скриншот с двумя примерами создания класса, а также свои комментарии, то как я понимаю строки кода на данном этапе. Хочу убедиться, что все правильно интерпретировал. Также есть строки со знаками ‘?’, где я не уверен как правильно охарактеризовать инструкцию. Буду признателен за уточнения и поправки к моим комментариям.
Скриншот

Отредактировано citizen404 (Май 16, 2017 11:24:11)

Прикреплённый файлы:
attachment method__init__.py (3,7 KБ)

Офлайн

#4 Май 16, 2017 12:28:31

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

Метод __init__ . Что это за зверь и с чем его едят ???

__init__() - это не конструктор, а инициализатор. Конструктор - это __new__() + __init__().

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

  
class A:
    pass

citizen404
Также есть строки со знаками ‘?’, где я не уверен как правильно охарактеризовать инструкцию.
Заголовок класса, заголовок метода __init__().



Отредактировано py.user.next (Май 16, 2017 12:31:12)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version