Тот факт, что вы присваиваете имя Foo
внутри определения класса, делает имя Foo
локальным именем в этой области (т. Е. Область действия класса).Локальные имена определяются статически, во время синтаксического анализа и компиляции в байт-код.Когда выполнение достигает оператора
Foo = Foo
, Python сначала оценивает правую часть.Он ищет локальное имя Foo
- как определено во время компиляции - и не может найти его в локальной области видимости.Отсюда ошибка.
То же самое произойдет, если вы попытаетесь
def test_foo():
foo = 3
class A:
bar = foo
foo = 42
test_foo()