Как сказано в руководстве, области поиска ищутся в следующем порядке: локальный, нелокальный, глобальный, встроенный.
Нелокальная область действия предназначена для включающих функций . Объявление класса не является функцией. Его пространство имен отбрасывается после того, как оно используется для создания __dict__
объекта класса, поэтому переменные на уровне класса не могут создавать нелокальные значения во вложенных функциях. Думайте о назначениях на уровне класса и чтениях переменных как о неявных присваиваниях и чтениях из скрытого мнения, а не как о локальных функциях. (Метаклассы могут даже заменить этот скрытый dict некоторым другим отображением.)
Но область видимости класса добавляет один нелокальный, __class__
. Это редко используется напрямую, но это важно для формы с нулевым аргументом super()
.
Это сам объект класса, поэтому он не инициализируется до тех пор, пока не завершится выполнение объявления класса. Таким образом, __class__.tricks
будет работать внутри метода, если он вызывается после , когда выполняется тело класса (обычный случай), но не если он вызывается во время выполнения тела класса.
Есть и другие области, о которых нужно знать в Python. Понимания создают локальную область видимости, подобно функциям. (Они в основном скомпилированы как функции генератора - типа с yield
внутри.) Кроме того, перехваченные исключения ограничены их условием обработки.
Вы можете увидеть пространство имен локальных пользователей, используя встроенные locals()
и глобальные переменные. используя globals()
. Встроенная область - это просто встроенный модуль. Нелокалы хитры. Они действительно появятся в locals()
, если компилятор увидит, что они используются. Объекты функций сохраняют ссылку на нелокальные значения, которые они используют в своем атрибуте __closure__
, который является кортежем ячеек.