Python не работает self

Переменная класса отказывается работать через «self», но работает с именем класса (Python)

У меня есть простой класс и переменная класса внутри этого класса:

Внутри этого класса в методе есть строка кода (метод вызывается из init ):

Эта строка не работает, переменная author_list по-прежнему пуста. Но если я изменю «self» на имя класса, оно будет работать нормально:

Декораторы не используются. Я чувствую, что здесь есть одна важная уловка, которую мне нужно понять, чтобы предотвратить серьезные проблемы в будущем.

Добавлено позже. Важная часть: у меня есть еще одна переменная класса, «кавычки», и она прекрасно работает. Вот почти полный фрагмент моего кода. Переменная класса «quotes» в порядке, переменная класса «hors_list «не в порядке.

Добавлено позже. Задача решена. Изменена последняя строка для соответствия направлениям из комментариев. Это решило мою проблему, теперь метод не создает новую переменную, а использует существующую пустую переменную класса:

2 ответа

Отредактировано после рассматриваемого издания: когда вы говорите self.authors_list = . , переменная класса не обновляется, вместо этого создается новая переменная объекта, и она доступна только для этого экземпляра класса. В случае quotes вы выполняете любое присваивание, и вместо этого вы делаете добавление, которое отражается в переменной класса quotes .

Когда вы сделали QuotesToScrape.authors_list вместо этого, вы изменили переменную класса, и это get отразилось на других экземплярах объекта, которые вы создадите впоследствии.

Попробуйте понять ваш случай с этим примером:

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

Проблема в том, что ваш код создает две переменные:

Один в пространстве имен класса

А другой в пространстве имен объекта.

Переменные определяются присваиванием в python. Так что, где вы их назначаете, имеет значение.

Обратите внимание, что из экземпляра объекта через self вы все равно можете получить доступ к переменной класса: если она не найдена в пространстве имен объекта, имя ищется в классе «пространство имен (и суперклассы»)

Источник

Класс 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.

Источник

Понимание переменной self в Python с примерами

Python Self Cariany используется для связывания экземпляра класса к методу экземпляра. Мы должны явно объявлять его как первый аргумент метода для доступа

Автор: Pankaj Kumar
Дата записи

Понимание переменной self в Python с примерами

Python Self переменная используется для связывания экземпляра класса к методу экземпляра. Мы должны явно объявлять его как первый аргумент метода для доступа к переменным и методам экземпляра. Эта переменная используется только с методами экземпляра.

В большинстве объектно-ориентированных языков программирования вы можете получить доступ к текущему объекту в методе без необходимости явно иметь его в качестве параметра метода. Например, мы можем использовать ключевое слово « это » для доступа к текущему объекту в программе Java. Но в Python мы должны явно объявлять экземпляр объекта как «самостоятельно» переменной.

Python Self – это ключевое слово?

Python Self Cariable не является зарезервированным ключевым словом. Но это лучшая практика и конвенция для использования имени переменной как «я» для обозначения экземпляра.

Читайте также:  Статьи затрат как правильно настроить

Пример self переменной Python

Скажем, у нас есть класс собаки, определенный как ниже.

Выход : Лабрадор лает.

  • Функция __init __ () определяется двумя переменными, но когда мы создаем экземпляр собак, мы должны предоставить только один аргумент. «Self» автоматически назначается на вновь созданный экземпляр класса собака.
  • Метод CARE () имеет только один аргумент – «Self», который получает связывание с экземпляром собаки, которая вызывает этот метод. Вот почему мы не передаем никаких аргументов при вызове метода коры ().
  • Если мы должны получить доступ к любой переменную экземпляра в функции, мы можем использовать оператор DOT.

Можем ли мы пропустить переменную «Self»?

Что, если метод экземпляра не должен получить доступ к переменным экземпляра. Можем ли мы пропустить самостоятельную переменную в этом случае?

Давайте узнаем простым примером.

Если вы запустите вышеуказанный код, не будет никакой ошибки. Но мы не называем методом коры (). Давайте посмотрим, что произойдет, когда мы пытаемся позвонить в метод коры ().

Мы получаем ошибку как метод коры () принимает 0 аргумент, но мы предоставили 1. Это потому, что когда мы звоним D.BARK () , экземпляр «D» автоматически передается как первый аргумент метода экземпляра коры ().

Но, если мы получим доступ к методу экземпляра коры () через ссылку на класс, то она будет работать нормально. Итак, позвонив Dog.bark () не приведет к ошибкам.

Подобные переменные для метода класса и статический метод?

Такое же поведение присутствует с классовыми методами тоже. Единственное отличие состоит в том, что Конвенция состоит в том, чтобы использовать « CLS » как имя переменной для ссылки на класс.

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

Давайте посмотрим на полный пример с Я и CLS Переменные и статический метод без каких-либо аргументов.

Быстрый пример, чтобы сломать конвенцию

Этот пример просто показать вам, что не обязательно использовать имя переменной как «Self» и «CLS». В реальном программировании всегда придерживайтесь этой конвенции.

Переменная «Self» связана с текущим экземпляром

Самоременная дает нам доступ к свойствам текущего экземпляра. Мы можем подтвердить это простым примером, создавая два разных экземпляра класса собачьи.

Почему бы не сделать «я» переменную неявную?

Было много предложений, чтобы сделать «самостоятельно» переменную зарезервированное ключевое слово и неявно доступна для метода экземпляра. Но предложение было отклонено «Гвидо Ван Россомом». Вы можете прочитать о них здесь и здесь Отказ

Источник

Что такое self в Python?

Объяснение self в python:

dog‎: у котов внутри есть мурчалка
dog‎: она реализована для всех котов в классе кот
‎dog‎: в объекте кот надо как то вызвать метод мурчало у класса кот
‎dog‎: как ты это сделаешь?
dog‎: кот.мурчало()
‎dog‎: ежели ты вызовешь кот.мурчало(), муркнут сразу все коты на свете
‎dog‎: а ежели ты вызовешь self.мурчало(), муркнет только тот кот, на которого указывает self

self — это ни в коем случае не зарезервированное слово. Это просто название переменной.

В методах класса первый параметр функции по соглашению именуют self, и это ссылка на сам объект этого класса. Но это именно соглашение. Вы вольны называть параметры как угодно.

Зачем это нужно?

Ну вот есть объект и вы хотите создать/изменить поле у этого объекта из метода этого самого объекта.

Источник

Оцените статью