Todas as explicações podem ser encontradas na documentação do Python. O tutorial do Python
Por seu primeiro erro <type 'exceptions.NameError'>: name 'outer_var' is not defined
. A explicação é:
Não há abreviatura para referenciar atributos de dados (ou outros métodos!) De dentro dos métodos. Acho que isso realmente aumenta a legibilidade dos métodos: não há chance de confundir variáveis locais e variáveis de instância ao percorrer um método.
citado em The Python Tutorial 9.4
Para o seu segundo erro <type 'exceptions.NameError'>: name 'OuterClass' is not defined
Quando uma definição de classe é deixada normalmente (por meio do final), um objeto de classe é criado.
citado em The Python Tutorial 9.3.1
Então, quando você tenta inner_var = Outerclass.outer_var
, o Quterclass
ainda não foi criado, é por issoname 'OuterClass' is not defined
Uma explicação mais detalhada, mas entediante, para seu primeiro erro:
Embora as classes tenham acesso aos escopos de funções de fechamento, elas não agem como escopos de fechamento para código aninhado dentro da classe: Python pesquisa funções de fechamento para nomes referenciados, mas nunca qualquer classe de fechamento. Ou seja, uma classe é um escopo local e tem acesso a escopos locais incluídos, mas não serve como um escopo local fechado para código aninhado adicional.
citado em Learning.Python (5º) .Mark.Lutz