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