Но почему переводчик не может найти функциональную панель в модуле? Только потому, что бар определен после ALL_FUNC?
Поскольку код выполняется в том порядке, в котором он указан в файле. Там, где вы пытаетесь присвоить значения ALL_FUNC
, определения функций не были выполнены.
но столбец в A также определяется после того, как к нему осуществляется доступ (в __init__
), почему self.bar()
можно найти безо всякой ошибки?
Потому что __init__
был вызван после того, как класс был определен. Ваш класс создается a = A()
после определения класса.
Ответ на наблюдение
Почему? bar
должно привести к ошибке, не так ли? Только потому, что он не используется в __main__
, поэтому ошибка не обнаружена? Но определение бара выполнено, верно?
Если бы вы позвонили bar()
, вы бы получили NameError
. Когда вы определили функцию bar
, код функции был интерпретирован , а не выполнен . Я не уверен, что это когда-нибудь поднимет что-то кроме SyntaxError
с, но определенно не NameError
с.
Однако bar
не всегда приводит к ошибке. Рассмотрим:
>>> def bar():
... print(k)
...
>>> bar()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in bar
NameError: global name 'k' is not defined
>>> k = "Foo"
>>> bar()
Foo