Подтвердить что ты не робот

Области переменных в классах python

Объявление переменной в классе (вне функции): все функции класса могут получить к ней доступ (в основном общедоступная переменная)

Объявление переменной внутри функции внутри класса: только эта функция может получить к ней доступ (ее в области функций)

Объявление переменной с именем self (имя переменной) внутри функции внутри класса: все функции класса могут получить к ней доступ (как это отличается от глобального (имя переменной)?)

и поскольку нет приватного/защищенного, все является общедоступным, поэтому все доступные изнутри класса доступны извне класса.

Есть ли какие-то другие нюансы, которые я должен знать, или у меня это получилось?

4b9b3361

Ответ 1

Поскольку листинг в вашем вопросе не на 100% ясен, я решил объяснить его простым примером. Он также включает некоторые вещи, такие как __something переменные, которые вы не упомянули в своем списке.

class Test:
    a = None
    b = None

    def __init__(self, a):
        print self.a
        self.a = a
        self._x = 123
        self.__y = 123
        b = 'meow'

В начале a и b - это только переменные, определенные для самого класса, доступные через Test.a и Test.b и не относящиеся к какому-либо экземпляру.

При создании экземпляра этого класса (который приводит к выполнению __init__):

  • print self.a не находит переменную экземпляра и, таким образом, возвращает переменную класса
  • self.a = a: создается новая переменная экземпляра a. Это затеняет переменную класса, поэтому self.a будет ссылаться на переменную экземпляра; для доступа к переменной класса теперь вам нужно использовать Test.a
  • Назначение self._x создает новую переменную экземпляра. Он считал "не частью публичного API" (он же защищен), но технически он не имеет никакого другого поведения.
  • Назначение self.__y создает новую переменную экземпляра с именем _Test__y, т.е. ее имя искажается, поэтому, если вы не используете исковое имя, к которому нельзя получить доступ извне класса. Это можно использовать для переменных "private".
  • Назначение b создает локальную переменную. Он недоступен нигде, кроме функции __init__, поскольку он не сохраняется в экземпляре, классе или глобальной области.

Ответ 2

Объявление переменной на верхнем уровне класса похоже на объявление статической или переменной класса. Квалифицируя его с помощью self, объявляется переменная экземпляра. Переменные класса могут быть изменены путем обращения к ним по имени класса (например, Class.x = 5), и все экземпляры наследуют эти изменения. Переменные экземпляра являются частными для экземпляра и могут быть изменены только этим экземпляром.

Вы можете достичь некоторого уровня контроля доступа с помощью символов подчеркивания. См. личные переменные в учебнике Python. По соглашению переменные, начинающиеся с одного подчеркивания, например, _foo являются непубличными частями API и имена, начинающиеся с двух символов подчеркивания, например. __foo будет иметь имя, обозначенное как _classname__foo.