С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/120: Рейтинг темы: голосов - 120, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 28.12.2018
Сообщений: 35
1

Объясните значение метода _init_ и параметр self

07.01.2019, 15:40. Показов 22353. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в книге как-то размыто описывается, а в инете я четкого ответа не нашла. Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2019, 15:40
Ответы с готовыми решениями:

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string...

Объясните понятие "параметр" функции/метода
Добрый вечер. Возможно вопрос глупый, но пожалуйста, дайте простой ответ для полного понимания...

Объясните значение метода SetFIO
Здравствуйте. Разбираясь с классами меня заинтересовал метод. Подскажите пожалуйста что делает этот...

Создание метода класса Init
Здравствуйте! Помогите, пожалуйста, разобрать, почему компилятор может выдавать такую ошибку: ...

при формировании отчёта в режиме 1 с выявляется ошибка метода контекста.Недопустимое значение параметра (параметр №1)
Здраствуйте я новенький в среде 1 с поэтому могу задавать глупые вопросы.При программировании в...

24
1290 / 675 / 365
Регистрация: 07.01.2019
Сообщений: 2,277
07.01.2019, 16:22 2
метод __init__ вызывается при создании объекта класса, self для обращения в переменным и методам объекта
0
Эксперт Python
5435 / 3858 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
07.01.2019, 16:33 3
Цитата Сообщение от Alycia Посмотреть сообщение
в книге как-то размыто
В какой книге? У Лутца (Изучаем Python) - а вы должны читать именно ее - в главе 26 и 28 написано все, что вы должны знать по теме классов.
1
0 / 0 / 0
Регистрация: 28.12.2018
Сообщений: 35
07.01.2019, 16:51  [ТС] 4
Цитата Сообщение от tooru Посмотреть сообщение
метод __init__ вызывается при создании объекта класса
т.е. init просто объявляет создание объекта?
0
4975 / 1003 / 144
Регистрация: 29.01.2013
Сообщений: 5,916
07.01.2019, 16:58 5
Цитата Сообщение от Alycia Посмотреть сообщение
init просто объявляет создание объекта?
нет, в нём описаны инструкции, которые выполняются при создании каждого экземпляра класса. Если вы знакомы с ООП в рамках других языков, то __init__ - это конструктор.
1
Эксперт Python
5435 / 3858 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
07.01.2019, 17:38 6
Цитата Сообщение от Alli_Lupin Посмотреть сообщение
в нём описаны инструкции, которые выполняются при создании каждого экземпляра класса
Это неверно. Экземпляр класса создается до вызова метода __init__. В __init__ он лишь инициализируется некими значениями. Поэтому это не конструктор, а инициализатор.
1
Alli_Lupin
07.01.2019, 18:03
  #7

Не по теме:

Цитата Сообщение от Garry Galler Посмотреть сообщение
Это неверно
Рекомендованный Вами Лутц. Издание 4-е, страница 718.
Однако имеется один метод перегрузки оператора, который можно встретить практически в любом классе: метод __init__, который известен как конструктор и используется для инициализации состояния объектов. Методу __init__ следует уделить особое внимание, потому что он, наряду с аргументом self, является одним из ключей к пониманию ООП в языке Python.

И во всех языках инструкции конструктора выполняются после создания объекта. Хотя бы потому что являются переопределением конструктора самого класса Object.

0
Эксперт Python
5435 / 3858 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
07.01.2019, 18:22 8
Лутц упрощает, дабы не вводить в ступор новичков. Никто не запрещает называть __init__ конструктором. Но изучив python чуть глубже вы узнает о существовании метода __new__, который и создает экземпляр.
Вы неверно объяснили суть метода __init__ - даже с учетом упрощенной подачи у Лутца - и я поправил.
1
0 / 0 / 0
Регистрация: 28.12.2018
Сообщений: 35
07.01.2019, 20:20  [ТС] 9
у меня еще один вопрос назрел, что такое экземпляр? Я так поняла это переменная которой присваивается класс

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dog():
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def sit(self):
        print(self.name.title() + ' is now sitting')
    
    def roll_over(self):
        print(self.name.title() + ' rolled over!')
 
my_dog = Dog('tuzik', 6) // Здесь переменной my_dog присваивается класс Dog и эта переменная 
//становится экземпляром?
print('Name my dog is ' + my_dog.name.title())
print(str(my_dog.age) + ' years old')
p.s. учусь по книге Эрик Мэтиз изучаем пайтон
0
Эксперт Python
5435 / 3858 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
07.01.2019, 21:19 10
Цитата Сообщение от Alycia Посмотреть сообщение
Я так поняла это переменная которой присваивается класс
Переменная это просто имя с которым связывается некоторое значение.
Значением переменной, разумеется, может быть и экземпляр класса.
Но переменная != экземпляр. Если копнуть чуть глубже - переменная это еще и ящик для хранения, потому что связана с указателем на некоторую область памяти.
И хранить она может что угодно.
А экземпляр какого-то класса это объект сконструированный этим классом и обладающий определенными свойствами\атрибутами.
1
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.01.2019, 21:34 11
Цитата Сообщение от Alli_Lupin Посмотреть сообщение
И во всех языках инструкции конструктора выполняются после создания объекта. Хотя бы потому что являются переопределением конструктора самого класса Object.
Каша в голове? Что Вы по Вашему называете "созданием" ?
Инициализация то же как бы часть создания/конструирования.

Для большинства языков например С/С++ обычно выделяют "выделение памяти" и "инициализацию" (этой самой памяти значениями") . Но с учетом того что память может выделяться (и освобождать) по разному и может быть "вложенность" объектов одного в другой, то все не так просто.

Добавлено через 5 минут
Цитата Сообщение от Alycia Посмотреть сообщение
// Здесь переменной my_dog присваивается класс Dog и эта переменная //становится экземпляром?
Переменной-ссылкой на экземпляр, но с учетом того что в питоне все "ссылки" то да можно опустить и говорить что это экземляр.
1
0 / 0 / 0
Регистрация: 28.12.2018
Сообщений: 35
07.01.2019, 22:01  [ТС] 12
Avazart, можете проверить правильность написания кода? Программа работает, но интересно я написала как положено или он на костылях?

Задание: Ресторан: создайте класс с именем Restaurant. Метод __init__() класса Restaurant должен
содержать два атрибута: restaurant_name и cuisine_type. Создайте метод describe_
restaurant(), который выводит два атрибута, и метод open_restaurant(), который выводит
сообщение о том, что ресторан открыт.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Restaurant():
    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
    
    def describe_restaurant(self):
        print('Our restaurant is name ' + self.restaurant_name.title())
        print('Our cuisin is ' + self.cuisine_type.title())
 
    def open_restaurant(self):
        print(self.restaurant_name.title() + ' Restaurant open from 9:00 am')
 
restaurant = Restaurant('Claude Monet', 'French')
print(restaurant.restaurant_name)
print(restaurant.cuisine_type)
restaurant.open_restaurant()
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.01.2019, 22:54 13
Да вроде все верно если делать поправку что это очередное глупое учебное задание.

Но в чем проблема, каков смысл этого класса? Как его предполагается использовать?
Это вопросы к больше к составителю задания...
Зная этом можно сказать точно правильно или нет. А так это это бессмысленная трата времени.

Добавлено через 4 минуты
Python
1
2
self.restaurant_name = restaurant_name
self.cuisine_type = cuisine_type
Лучше члены класса делать недоступными(закрытыми) из вне с помощью __ если сразу не оговорено обратное (инкапсуляция, скрытые данных)
Python
1
2
self.__restaurant_name = restaurant_name
self.__cuisine_type = cuisine_type
А для доступа использовать такой инструмент как "свойства".

Цитата Сообщение от Alycia Посмотреть сообщение
метод describe_restaurant(), который выводит
сообщение о том, что ресторан открыт
Лучше в место метода перегрузить методы __str__ и __repr__


Использование print внутри класса плохой стиль, это делает класс монолитным и лишает его гибкости.
Что к примеру если мы захотим выводить его не в консоль, а к примеру в файл?
0
1729 / 969 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
08.01.2019, 00:39 14
Alycia, Что бы понять ООП (объектно ориентированное программирование) нужно обратится к реальности, а точнее к реальному мышлению человека. ООП просто моделирует часть реального мышления человека. Вы ведь в школе изучали виды животных, их классы и подклассы. Например класс парнокопытных и его подкласс коза. Когда мы говорим о козе абстрактно, то оперируем понятием коза принимая во внимание ее свойства, которые присущи всем козам, (рога, копыта, шерсть, цвет, 2 глаза, 4 ноги и так далее), а так же что может делать коза ( в питоне это методы). Например давать молоко, давать шерсть, питаться травой и т.д. Так вот такое обобщенное понятие козы соответствует self в питоне. Класс в питоне может описать класс коз в реальности. Конкретные козы в реальности это экземпляры класса class козы() в питоне. А self для класса "козы" в питоне, соответствует обобщенному понятию козы в мышлении человека.
С помощью инструкции __init__ мы описываем какие свойства у любого экземпляра класса должны быть, И так как это для всех экземпляров класса, то мы эти свойства (атрибуты) присваиваем обобщенному объекту self. То есть те свойства (атрибуты), которыми обладает обобщенный объект класса "козы" self, обладают все конкретные экземпляры этого класса, то есть конкретные козы. Но конкретным козам (экземплярам) могут принадлежать и свои индивидуальные свойства (атрибуты), например пятно на боку, которые не принадлежат другим козам и потому отсутствую у обобщенной козы ( в питоне обозначаемой self).
Написал много, но что не понятно, то задавайте вопросы.

Добавлено через 6 минут
Но сразу замечу, что классы в питоне не строго ответствуют классическим классам в мышлении человека в плане наследования и общих для класса свойств. Но пока не забивайте себе этим голову, эту особенность поймете потом, при углубленном изучении классов.

Добавлено через 50 минут
Добавлю немного про про объекты в питоне и про переменные в нем. Объекты в питоне, это выделенная область в памяти компьютера содержащая определенную информацию, как то числа , экземпляры классов с их атрибутами , словари, списки , строки, файлы и так далее. Для этих объектов обычно существуют переменные, которые содержат ссылки на эти объекты и ничего более. В этом отличие питон от других языков. В других языках переменная является именем конкретной области в памяти где находится информация, и поэтому в тех языках переменная требует объявления с указанием типа. В питоне все по другому. переменная не привязана жестко с областью памяти а только содержит ссылку на некоторый объект в области памяти. Мы можем поменять ссылку в переменной, что бы она ссылалась на другой объект любого типа. Именно поэтому для переменных в питоне не присваивается изначально тип. Любая переменная может перенаправляться ссылкой на любой объект любого типа. Классы в питоне, это объекты. Имя класса, это переменная содержащая ссылку на объект класса в памяти компьютера. Экземпляр класса, это тоже объект. Кстати такая тонкость.
Python
1
2
3
4
5
class Super:
    def __init__(self, data):
        self.data = data
    def ham(self):
        pass
Мы создали класс Super, и с помощью __init__ указали, что все экземпляры этого класса имеют атрибут (свойство) data.
Создание объекта экземпляра происходит когда мы обращаемся через переменную Super к объекту класса применяя круглые скобки.
Запись
Super('spam') создает экземпляр этого класса (объект в памяти) с атрибутом data и его значением 'spam'. Но при этом нет переменной, которая бы на него ссылалась. В некоторых случаях этот прием используется, когда в выражение подставляется не переменная ссылающаяся на экземпляр, а сам экземпляр без имени.
Для того же что бы получить переменную со ссылкой на этот объект экземпляра, необходима следующая запись.
x = Super('spam'). Тогда переменная x будет иметь ссылку на этот экземпляр и через нее мы можем к нему обращаться.
Пока все. Какие будут еще вопросы, обращайтесь.
4
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.01.2019, 00:42 15
Цитата Сообщение от Viktorrus Посмотреть сообщение
Alycia, Что бы понять ООП (объектно ориентированное программирование) нужно обратится к реальности, а точнее к реальному мышлению человека. ООП просто моделирует часть реального мышления человека. Вы ведь в школе изучали виды животных, их классы и подклассы.
А я бы крайне советовал избегать такого подхода.

И советовал бы относиться к ООП как к инструменту, не более без всякой метафизической ерунды.

Это лишь инструмент позволяющий выразить свои мысли в коде, не более.
И этот инструмент как и любой другой можно использовать не правильно, вместо упрощения кода - усложнять его.
Или вообще просто писать бессмысленный код как Ваше учебное задание.
1
1729 / 969 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
08.01.2019, 06:07 16
Avazart, Avazart, А я бы Вам советовал не переоценивать себя и не считать себя умнее других. Я знаю, что могу ошибаться, а вот Вы похоже про себя такого не думаете и готовы с ходу начать учить других. Удачи Вам в самоутверждении. Поучитесь, как должен себя вести истинный профессионал у Garry Galler. Извините , если был грубоват.

Добавлено через 1 час 44 минуты
Alycia, По поводу Вашего примера
Python
1
2
3
4
class Restaurant():
    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
Здесь все правильно, это классика. Двойного подчеркивания
Python
1
2
self.__restaurant_name = restaurant_name
self.__cuisine_type = cuisine_type
здесь не нужно, оно используется только в больших проектах, когда может быть путаница с именами атрибутов. Двойное подчеркивание автоматически к имени атрибута цепляет имя класса. Вам это не нужно, будет только загромождать программу.
В задании Вас просят только создать класс с заданной структурой. Проверку созданного класса Вы видимо придумали сами.
Я бы проверку сделал так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Restaurant():
    def __init__(self, restaurant_name, cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type = cuisine_type
    
    def describe_restaurant(self):
        # print('Our restaurant is name ' + self.restaurant_name.title())
        # print('Our cuisin is ' + self.cuisine_type.title())
 
        print('Our restaurant is name ', self.restaurant_name)
        print('Our cuisin is ', self.cuisine_type)
 
        # метод title используется тогда, когда нужно начальные буквы в словах преобразовать 
        # из строчных в прописные. Я не вижу здесь в этом необходимости. Но если хотите,
        # то можете оставить.
        # А вот опратор '+' здесь излишен. Достаточно просто указать два аргумента
        #  и print выведет их значения одной строкой
 
    def open_restaurant(self):
        print(self.restaurant_name, ' Restaurant open from 9:00 am')
 
restCM = Restaurant('Claude Monet', 'French') # Даем сокращенное имя экземпляру класса Restaurant,
                                              # а именно конкретному ресторану с именем Claude Monet.
                                              # Имена экземплярам лучше давать с маленькой буквы,
                                              # что бы не путать с именами классов, которые принято
                                              # начинать с прописной буквы, и лучше отличное от имени класса,
                                              # что бы не путаться.
# Теперь проверяем работу методов
 
restCM.describe_restaurant()                  # Круглые скобки после названия метода вызывают его
                                              # (аналогично как и для функций)
restCM.open_restaurant()
Выводит:
Our restaurant is name Claude Monet
Our cuisin is French
Claude Monet Restaurant open from 9:00 am

Добавлено через 21 минуту
Кстати по поводу использования методов перегрузки __str__ и __repr__, использование их на начальной стадии обучения излишне. В свое время когда дойдете до их изучения , то тогда и освоите зачем и как их использовать. У М.Лутца целая глава посвящена изучению методов перегрузки операторов.
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.01.2019, 11:17 17
Цитата Сообщение от Viktorrus Посмотреть сообщение
Avazart, Avazart, А я бы Вам советовал не переоценивать себя и не считать себя умнее других.
А я советую применить этот Ваш совет к самому себе прежде чем что либо озвучивать...

Добавлено через 9 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
здесь не нужно, оно используется только в больших проектах, когда может быть путаница с именами атрибутов. Двойное подчеркивание автоматически к имени атрибута цепляет имя класса. Вам это не нужно, будет только загромождать программу.
А типа в маленьких проектам есть право гавнокодить?

Цитата Сообщение от Viktorrus Посмотреть сообщение
использование их на начальной стадии обучения излишне.
Типа "делать сразу правильно" это излишне?
По Вашему лучше делать неправильно и потом переучиваться?

Добавлено через 3 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
В задании Вас просят только создать класс с заданной структурой.
Я бы сказал куда такое задание можно ...
1
1729 / 969 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
08.01.2019, 16:41 18
Avazart, Не хотел отвечать, но не удержался
Цитата Сообщение от Avazart Посмотреть сообщение
А типа в маленьких проектам есть право гавнокодить?
Цитата Сообщение от Avazart Посмотреть сообщение
Типа "делать сразу правильно" это излишне?
По Вашему лучше делать неправильно и потом переучиваться?
На уровне начинающего это не является неправильным, просто ограниченно областью применения в соответствии с теми задачами, которые решает начинающий.
Если следовать Вашим советам то учащихся в первом классе сразу нужно учить высшей математике, что бы по Вашему все было правильно, с учетом самых сложных задач математики? Сомневаюсь, что кто то из них после этого что либо освоит и станет профессиональным математиком.
Для того, что бы учить других, мало быть профессионалом в своей области, нужно еще быть профессионалом в преподавательской деятельности.
Все больше в дискуссию с Вами не вступаю, Вы все равно не понимаете о чем я говорю.
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.01.2019, 20:42 19
Цитата Сообщение от Viktorrus Посмотреть сообщение
Если следовать Вашим советам то учащихся в первом классе сразу нужно учить высшей математике, что бы по Вашему все было правильно, с учетом самых сложных задач математики? Сомневаюсь, что кто то из них после этого что либо освоит и станет профессиональным математиком.
Нужно учить не математики, а умению мыслить и придерживать принципов которые которые этому помогают.
Иначе получите бездарей думающих что "на ноль делить нельзя".

Цитата Сообщение от Viktorrus Посмотреть сообщение
Для того, что бы учить других, мало быть профессионалом в своей области, нужно еще быть профессионалом в преподавательской деятельности.
Так обычно говорят бездари ничего не достигшие в своей области, "сам не умеешь - учи других".
0
0 / 0 / 1
Регистрация: 19.09.2016
Сообщений: 11
13.02.2020, 04:06 20
С помощью инструкции __init__ мы описываем какие свойства у любого экземпляра класса должны быть
Viktorrus, Но можно же задавать и не через __init__, к примеру так?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Koza():
    kopita = 4
    roga = 2
    sherst = True
    glaza = 2
    name = 'Маруся'
    
    def daetMoloka(self, time):
        return (time*2)
     
# Создаем экземпляр
koza1 = Koza()            
# Свойства класса
print('Рога:', koza1.roga)
print('Имя:', koza1.name)
print('Молоко в N часов (2/час):',koza1.daetMoloka(4))
Или такой вариант не корректный и в более продвинутой разработке где-нибудь найдет коса на камень?)
0
13.02.2020, 04:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2020, 04:06
Помогаю со студенческими работами здесь

Передача метода в метод, метода как параметр
Здравствуйте друзья. Есть значит некоторый фрейм: public class Window extends JFrame implements...

Нарисуйте блок-схему реализации метода Queue::Get. Объясните работу метода
Нарисуйте блок-схему реализации метода Queue::Get. Объясните работу метода. Ребя может кто помочь

Ошибка при загрузке Ubuntu 14.04 LTS: run-init: /sbin/init: Permission denied
Здравствуйте! На компьютере установлена Uuntu 14.04 LTS (64 bit). После установки cups (для...

не берётся значение из init param
Здравствуйте. Я не особо силён в java, поэтому столкнулся с проблемой. Есть servlet и в нём функция...

Объясните 3й параметр
fontDialog1.Font = new Font(str, float.Parse(str), (FontStyle)Enum.Parse(typeof(FontStyle), str));...

Объекты: параметр-значение и параметр-переменная
Если сделать код таким: type TPos=object ax,ay:integer; constructor...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru