Как я могу получить доступ к переменной класса в инициализаторе в Python?

Я думал, что оператор class в Python создает область. Но, пробуя этот простой код, я получаю сообщение об ошибке:

 class A(): foo = 1 def __init__(self): print foo a = A() NameError: global name 'foo' is not defined 

Почему foo недоступен из инициализатора? Каков правильный способ доступа к нему?

Классы не создают область действия. Это описано в pep 227 :

Имена в классе не доступны. Имена разрешаются в самой внутренней области приложения. Если определение класса происходит в цепочке вложенных областей, процесс разрешения пропускает определения классов.

и в документации по составной части class :

Затем пакет класса выполняется в новом кадре выполнения (см. Раздел « Именование и привязка» ), используя недавно созданное локальное пространство имен и исходное глобальное пространство имен. (Обычно набор содержит только определения функций.) Когда пакет класса завершает выполнение, его кадр выполнения отбрасывается, но его локальное пространство имен сохраняется . [4] Объект класса затем создается с использованием списка наследования для базовых классов и сохраненного локального пространства имен для словаря атрибутов.

Акцент мой; кадр выполнения является временной областью.

Чтобы получить доступ к foo , используйте self.foo :

 class A(): foo = 1 def __init__(self): print self.foo 

или получить доступ к классу A по имени или использовать type(self) для доступа к текущему классу (который может быть подклассом):

 def __init__(self): print A.foo 

или

 def __init__(self): print type(self).foo