Toutes les explications se trouvent dans Documentation Python Le tutoriel Python
Pour votre première erreur <type 'exceptions.NameError'>: name 'outer_var' is not defined
. L'explication est la suivante :
Il n'existe pas de raccourci pour référencer les attributs de données (ou d'autres méthodes !) à l'intérieur des méthodes. Je trouve que cela augmente la lisibilité des méthodes : il n'y a aucune chance de confondre les variables locales et les variables d'instance en parcourant une méthode.
cité par Le tutoriel Python 9.4
Pour votre deuxième erreur <type 'exceptions.NameError'>: name 'OuterClass' is not defined
Lorsqu'une définition de classe est quittée normalement (par la fin), un objet de classe est créé.
cité par Le tutoriel Python 9.3.1
Donc quand vous essayez inner_var = Outerclass.outer_var
le Quterclass
n'a pas encore été créée, c'est pourquoi name 'OuterClass' is not defined
Une explication plus détaillée mais fastidieuse pour votre première erreur :
Bien que les classes aient accès à l'étendue des fonctions englobantes, elles n'agissent pas en tant que scopes d'inclusion pour le code imbriqué dans la classe : Python recherche les fonctions englobantes pour les noms référencés, mais jamais dans les classes englobantes. En d'autres termes, une classe est une portée locale et a accès aux portées locales englobantes, mais elle ne sert pas de portée locale englobante à du code imbriqué supplémentaire.
cité par Apprendre.Python(5ème).Mark.Lutz