Форум сайта python.su
Доброго времени суток уважаемые форумчане !
Я только недавно приступил к изучению языка Питон, и скажу сразу, что сам процесс дается мне тяжело, ибо я отношу себя к т.н. хроническим гуманитариям. Начал изучение с книги Э.Мэтиза - “Изучаем 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 – локальная переменная. Поскольку мы в явном виде
указываем, к которому имени мы обращаемся, путаницы не возникнет."
Если это возможно, прошу дать исчерпывающий ответ более менее простым языком. Также буду благодарен за ссылки на учебные материалы по Питону для чайников.
з.ы. Прошу прощения за допущенные мною вольности и неточности в изложении вопроса и заранее благодарю всех кто откликнется.
Прикреплённый файлы: Screenshot_1.png (15,2 KБ)
Офлайн
>>> 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Инициализирует экземпляр класса. В данном случае сохраняет внутри экземпляра (как в коробочке) переданное при создании экземпляра имя. Потом это сохранённое имя используется методом sayHi(), который получает доступ в коробочку через свой первый аргумент - self.
Я не могу понять, какую роль/функцию/назначение играет метод __init__ .
citizen404Когда что-то передаёшь при создании экземпляра, чтобы оно сохранилось внутри экземпляра.
Объясните на пальцах в каких случаях нужно использовать __init__
citizen404Экземпляр при вызове методов у него передаёт сам себя в свой метод первым аргументом. Так метод может обращаться внутрь экземпляра, чтобы сохранять в него что-то или доставать из него что-то.
Зачем указывается параметр self ? О чем это нам говорит ?
citizen404Внутри экземпляра создаёт переменную name в которую записывает значение, переданное внутрь метода через параметр name. Просто они именуются одинаково, но могли бы и по разному именоваться. Но так как у них разные пространства имён, то эти одинаковые имена никак не конфликтуют, так как считаются разными.
И особенно не понятна строка №3 - self.name = name ??? Для чего эта манипуляция ? Что эта запись по сути вообще выполняет ?
Отредактировано py.user.next (Май 14, 2017 16:16:54)
Офлайн
Cпасибо огромное! Благодаря Вашим пояснениям, потихоньку начинаю осмысливать полученную информацию.
py.user.nextДа с этим как раз у меня вроде бы нет проблем. Я для себя понял, что класс - это как бы прообраз/чертеж некоего объекта, а экземпляр - уже сам готовый объект, коих может быть сколь угодно много.
Тебе нужно понять различие между классом и экземпляром класса.
Отредактировано citizen404 (Май 16, 2017 11:24:11)
Прикреплённый файлы: method__init__.py (3,7 KБ)
Офлайн
__init__() - это не конструктор, а инициализатор. Конструктор - это __new__() + __init__().
Класс определяется без круглых скобок
class A: pass
citizen404Заголовок класса, заголовок метода __init__().
Также есть строки со знаками ‘?’, где я не уверен как правильно охарактеризовать инструкцию.
Отредактировано py.user.next (Май 16, 2017 12:31:12)
Офлайн