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

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

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

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

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

Есть ли еще какие-то нюансы, которые я должен знать, или я их понял?

4 ответа

Поскольку информация в вашем вопросе не ясна на 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то есть его имя искажено, поэтому если вы не используете искаженное имя, к нему нельзя получить доступ извне класса. Это может быть использовано для "частных" переменных.
  • Назначение b создает локальную переменную. Это не доступно нигде, кроме __init__ функция, поскольку она не сохраняется в экземпляре, классе или глобальной области видимости.

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

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

Хотя ответили, позвольте мне добавить несколько комментариев к вашим вопросам:

объявление переменной в классе (вне функции): все функции класса могут получить к ней доступ (в основном это общедоступная переменная): comment: это похоже на статическую переменную и может вызываться с использованием имени класса. Эти переменные доступны всем функциям, любые функции могут изменять их и распечатывать.

объявление переменной внутри функции внутри класса: только эта функция может получить к ней доступ (она находится в этой области функций): comment: если переменная объявлена ​​без self, то она доступна только внутри этой функции, своего рода локальная переменная. Однако, если он объявил использование self наподобие self.var= 'somevalue',, тогда он доступен через любой объект, но не через имя класса.

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

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

Мы можем использовать область действия для этого как: case 1: в классе
class test:<br> def __init__(self, a): self.__elements = a<br> def change_a(self): self.__elements = 5

Случай 2: вне класса
t = test(5)

Это получит доступ как object._classname__privatevaribalename

print(t._test__elements)

это напечатает значение изменения

Другие вопросы по тегам