Области применения переменных в классах Python - PullRequest
42 голосов
/ 17 апреля 2011

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

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

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

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

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

Ответы [ 4 ]

102 голосов
/ 17 апреля 2011

Поскольку информация в вашем вопросе не ясна на 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__, поскольку он не сохраняется в экземпляре, классе или глобальной области видимости.
20 голосов
/ 17 апреля 2011

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

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

0 голосов
/ 14 сентября 2018

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

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

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

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

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

0 голосов
/ 12 сентября 2018

мы можем использовать область действия для этого как: случай 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)

, при этом будет напечатано измененное значение `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...