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

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

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

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

One Solution collect form web for “Как я могу получить доступ к переменной класса в инициализаторе в Python?”

Классы не создают область действия. Это описано в 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 
  • Как уловить все исключения класса старого стиля в python?
  • Как Python сравнивает строку и int?
  • Для чего используется Python's coerce ()?
  • Почему не исключает, что объект поймает все в Python?
  • Как я могу сказать dict () в Python 2 использовать unicode вместо строки байта?
  • Есть ли какая-либо реализация Python2, где упорядочение является транзитивным?
  • Печать строки печатает 'u' перед строкой в ​​Python?
  • Какова цель `__metaclass__ = type`?
  • Python - лучший язык программирования в мире.