Ответ 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__
, поскольку он не сохраняется в экземпляре, классе или глобальной области.