Для чего в python нужен self?
Ребят, кто может нормально объяснить для чего в языке python нужен self? Уже несколько статей перечитала и все никак не могу понять. Буду крайне благодарна.
Нормально объяснить может dark:
dark: у котов внутри есть мурчалка
dark: она реализована для всех котов в классе кот
dark: в объекте кот надо как то вызвать метод мурчало у класса кот
dark: как ты это сделаешь?
dark: кот.мурчало()
dark: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете
dark: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self
![]()
Просто сам объект, от которого вызван метод.
![]()
self нужен для обращения к полям экземпляра класса и вообще для обозначения экземпляра класса. Есть подробный ответ, например, здесь .
Т.е. если приглядеться, то можно увидеть некую параллель между записью «self.name» (см. п. 1.) и записью «nick_name.name» (см. п. 4.).
Сам «self» – это своеобразная ссылка на будущий экземпляр класса «nick_name».
Чтобы понять, ответьте на вопросы
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Класс self в Python
В этом уроке мы изучим использование self в Python. Это часто становится предметом споров среди экспертов и проблемой для новичков.
Python – это не язык, который создавался для парадигмы объектно-ориентированного программирования. Таким образом, создание статического метода в Python не является прямым. Посмотрим, как это делается:
Теперь, чтобы создать метод, который может работать с реальным объектом «Person», нам нужно предоставить ему ссылку на этот объект. Итак, вместо передачи полного объекта Person в его собственный класс мы можем использовать self как:

Затем давайте посмотрим, как его можно использовать для доступа к полям в самом конструкторе класса.
Самостоятельный конструктор
self также может использоваться для ссылки на поле переменной в классе:
В приведенном выше фрагменте self относится к переменной имени всего класса Person. Обратите внимание: если у нас есть переменная в методе, self не будет работать. Эта переменная просто существует только во время выполнения этого метода и, следовательно, является локальной для этого метода. Для определения глобальных полей (переменных полного класса) нам нужно определить их ВНЕ методов класса. Обратитесь к области переменной python.

self – ключевое слово?
self используется во многих местах в Python, поэтому люди думают, что это ключевое слово. Но в отличие от C ++ self не является ключевым словом.
Фактически мы можем использовать любое имя для первого параметра метода, но настоятельно рекомендуется придерживаться соглашения о его вызове самостоятельно.
Это означает, что последний класс можно сделать как:
Должны ли мы передать self методу?
Приведенное выше объяснение открывает новый вопрос, должны ли мы просто передать self методу? Давайте рассмотрим класс Person, который содержит метод, определенный как:
Если personMe является экземпляром класса и вызывается personMe.something (arg1, arg2), python внутренне преобразует его для нас как:
Переменная self относится к самому объекту.
Это все для self и его использования в конструкторе и функциях для получения текущей ссылки на объект.
Что означает self в Python?
В Python self является причиной многих проблем для разработчиков, которые занимаются объектно-ориентированным программированием, давайте попробуем разобраться в этом вопросе!
Когда я начал всерьез интересоваться Python и объектно-ориентированным программированием, я никак не мог понять одну вещь: self.
Сначала я просто добавлял его внутри своих методов и перед каждым атрибутом, не понимая, что происходит на заднем плане, потому что в целом программа работала нормально.
Очень важно, чтобы вы понимали, что означает это “self” и почему оно полезно при разработке на Python.
Это ключевое понятие в объектно-ориентированном программировании, которое вам необходимо понять!
Создадим класс
Допустим, вы фанат велоспорта и хотите создать программу для борьбы с вашей всепоглощающей зависимостью от облегающих спортивных шорт:
Для начала я напомню вам разницу между переменной экземпляра и переменной класса, чтобы вам было понятнее:
Переменные класса – это переменные, которые являются общими для всех экземпляров вашего класса.
В нашем классе Velo переменная wheels является переменной класса.
Это вполне логично, потому что почти все велосипеды работают на двух колесах и не более, если только вы не живете в Юго-Восточной Азии и не ездите регулярно на тук-туке.
Мы определяем их внутри класса, но вне всех остальных методов!
Примечание. Внутри класса мы говорим уже не о функциях, а о методах.
С другой стороны, у нас есть переменные экземпляра, значения которых отличаются от экземпляра к экземпляру.
В нашем примере переменные self.brand, self.price и self.weight являются переменными экземпляра.
Как вы можете видеть, они определяются внутри метода init.
В Python этот специальный метод выполняется автоматически каждый раз, когда вы создаете новый объект из своего класса.
Поэтому вы должны вложить все, что свойственно объекту, который вы хотите создать.
Давайте посмотрим, что произойдет, если я создам два экземпляра класса Velo и попытаюсь получить доступ к этим переменным:
Как я уже сказал, все экземпляры имеют доступ к переменным класса, вот почему два моих велосипеда имеют по два колеса, и мне не нужно ничего указывать.
Однако вы можете видеть, что каждый велосипед имеет свой собственный бренд, потому что это два разных экземпляра!
В чем цель self?
Когда я создавал свой метод init, вы заметили, что в дополнение к параметрам я добавил слово self.
Я также использовал его для определения переменных экземпляра.
Self используется для представления экземпляра класса! Благодаря ему я могу получить доступ к атрибутам и методам своего класса.
Давайте создадим метод экземпляра, чтобы вы могли увидеть это на практике:
Я создал метод drive в классе Velo и указал self в качестве первого параметра:
Поэтому я могу вызвать этот метод drive на всех созданных мною экземплярах.
Примечание. Обратите внимание, что вам не нужно явно использовать слово self, поскольку оно не является зарезервированным словом в Python. Если вы пришли из другого языка программирования, например, JavaScript, вам, возможно, привычнее это использовать. Поэтому вы можете использовать Maria вместо self, и это будет работать точно так же.
В Python мы традиционно используем слово self, но вы можете поступать так, как хотите (мы не советуем, даже если нам нравится Мария )!
С другой стороны, есть правило, которое вы должны соблюдать абсолютно точно:
Когда вы определяете метод экземпляра, ваш экземпляр, то есть self (или слово, которое вы выбрали для обозначения вашего экземпляра), всегда должен передаваться в первой позиции, это обязательно, поэтому обратите на это внимание.
Секрет self
Возможно, вы заметили, но в последнем примере я вызвал метод drive без передачи каких-либо аргументов, и все же код сработал. Мне удалось вывести сообщение с брендом велосипеда текущего экземпляра.
Вы можете задаться вопросом, как мой метод drive знает, что нужно использовать атрибуты именно этого экземпляра, а не другого?
Я думаю, вы поняли, это все self!
Когда я это делаю:
Вот что происходит за кулисами:
Интерпретатор Python автоматически выполняет “преобразование” за вас!
С одной стороны, это делает ваш код более эстетичным, а с другой – облегчает жизнь, когда вы хотите наследовать свой класс от других классов.
И, очевидно, если вы забудете добавить self при определении метода экземпляра, у вас возникнут небольшие проблемы, когда вы захотите его использовать:
Эта ошибка часто непонятна людям, не привыкшим к объектно-ориентированному программированию.
Python сообщает нам, что методу drive был передан аргумент (1 was given), однако, если посмотреть на наш код, мы не передаем никакого аргумента.
Как мы только что видели выше, в фоновом режиме Python использует ваш класс для выполнения метода drive и автоматически передает экземпляр в качестве первого аргумента.
Итак, аргумент передается методу drive, просто вы этого не видите, и это делаете не вы, Python сам об этом позаботится.
Поэтому вы должны указать self в качестве первого параметра в определении метода drive, чтобы использовать его с экземпляром velo_01.