Усі пояснення можна знайти в Документації на Python The Tutorial
Для вашої першої помилки <type 'exceptions.NameError'>: name 'outer_var' is not defined
. Пояснення:
Немає скорочень для посилання на атрибути даних (або інші методи!) Зсередини методів. Я вважаю, що це фактично збільшує читабельність методів: немає шансів плутати локальні та екземплярні змінні при огляді методу.
цитується з Підручника Python 9.4
Для вашої другої помилки <type 'exceptions.NameError'>: name 'OuterClass' is not defined
Коли визначення класу залишається нормально (через кінець), створюється об’єкт класу.
цитується з Підручника Python 9.3.1
Тож коли ви намагаєтеся inner_var = Outerclass.outer_var
, Quterclass
ще не створено, ось чомуname 'OuterClass' is not defined
Більш детальне, але виснажливе пояснення вашої першої помилки:
Хоча класи мають доступ до областей функцій, що додаються, вони, однак, не виконують функції охоплюючих областей до коду, вкладеного в клас: Python здійснює пошук вкладених функцій для імен, на які посилаються, але ніколи до класів, що додають. Тобто клас - це локальний діапазон і має доступ до локальних областей, але він не служить для локальної області застосування для подальшого вкладеного коду.
цитується з Learning.Python (5-й) .Mark.Lutz