Todas las explicaciones se pueden encontrar en la documentación de Python El tutorial de Python
Por su primer error <type 'exceptions.NameError'>: name 'outer_var' is not defined
. La explicacion es:
No existe una abreviatura para hacer referencia a atributos de datos (¡u otros métodos!) Desde dentro de los métodos. Encuentro que esto realmente aumenta la legibilidad de los métodos: no hay posibilidad de confundir las variables locales y las variables de instancia cuando se examina un método.
citado de The Python Tutorial 9.4
Por tu segundo error <type 'exceptions.NameError'>: name 'OuterClass' is not defined
Cuando una definición de clase se deja normalmente (al final), se crea un objeto de clase.
citado de The Python Tutorial 9.3.1
Entonces, cuando lo intentas inner_var = Outerclass.outer_var
, Quterclass
aún no se ha creado, por esoname 'OuterClass' is not defined
Una explicación más detallada pero tediosa de su primer error:
Aunque las clases tienen acceso a los alcances de las funciones adjuntas, no actúan como alcances adjuntos al código anidado dentro de la clase: Python busca funciones adjuntas para nombres referenciados, pero nunca clases adjuntas. Es decir, una clase es un ámbito local y tiene acceso para incluir ámbitos locales, pero no sirve como un ámbito local adjunto para el código anidado adicional.
citado de Learning.Python (quinto) .Mark.Lutz