Области применения переменных в классах 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)