Coletânea Python do ZERO às Redes Neurais Artificiais
Escopo / Indentação de uma classe
Já que uma classe é uma estrutura que pode guardar qualquer tipo de
bloco de código dentro de si, é muito importante respeitarmos a indentação correta desses blocos de código, assim como entender que, exatamente como funciona na programação convencional estruturada, existem escopos os quais tornam itens existentes dentro do mesmo bloco de código que podem ou não estar acessíveis para uso em funções, seja dentro ou fora da classe. Ex:
Neste momento foque apenas no entendimento do escopo, o bloco de código acima tem estruturas que estaremos entendendo a lógica nos capítulos seguintes.
Inicialmente é criada uma classe de nome Pessoa, dentro dela existe a variável de nome administrador com sua respectiva atribuição ‘Admin’, esta variável de acordo com sua localização indentada estará disponível para uso de qualquer função dentro ou fora dessa classe.
Em seguida temos o método construtor que simplesmente recebe um nome atribuído pelo usuário e exibe uma mensagem padrão conforme declarado pela variável msg.
Na sequência é criada uma função chamada método1 que dentro de si apenas possui o comando para exibir o conteúdo de msg, porém, note que msg é uma variável dentro do escopo do método construtor, e em função disso ela só pode ser acessada dentro deste bloco de código.
Por fim, fora da classe é criada uma variável de nome var1 que instancia a classe Pessoa passando ‘Fernando’ como o parâmetro a ser substituído em self.nome.
Por meio da função print( ) passando como parâmetro var1 , o retorno será a exibição de msg, uma vez que é a única linha de código que irá retornar algo ao usuário.
Sendo assim o retorno será: Classe Pessoa em execução.
Já ao tentarmos executar msg dentro da função metodo1, o retorno será NameError: name 'msg' is not defined, porque de fato, msg é uma variável interna de __init__, inacessível para outras funções da mesma classe.
Apenas concluindo o raciocínio, a variável msg, “solta” dentro do bloco de código construtor, somente é acessível e instanciável neste mesmo bloco de código.
Porém, caso quiséssemos tornar a mesma acessível para outras funções dentro da mesma classe ou até mesmo fora dela, bastaria reformular o código e indexa-la ao método de classe por meio da sintaxe self.msg, por exemplo.
Note que agora msg é um dos parâmetros a ser repassados pelo usuário no momento da criação da variável que instancia a classe Pessoa.
Dessa forma, por meio da função print( ) fora da classe conseguimos perfeitamente instanciar tal variável uma vez que agora internamente a classe existe a comunicação do método construtor e da função metodo1.
De imediato isto pode parecer bastante confuso, porém por hora o mais importante é começar a entender as possibilidades que temos quando se trabalha fazendo o uso de classes, posteriormente estaremos praticando mais tais conceitos e dessa forma entendendo definitivamente sua lógica.
Apenas finalizando o entendimento de escopo, caso ainda não esteja bem
entendido, raciocine da seguinte forma:
Por fim somente fazendo um adendo, é muito importante você evitar o
uso de variávels/objetos de classe de mesmo nome, ou ao menos ter bem claro qual é qual de acordo com seu escopo.
Apenas simulando uma situação dessas, note que dentro da classe Pessoa existe o objeto de classe nome, de atributo ‘Padrão’, em seguida existe um método construtor que dentro de si também possui um objeto de classe nome, agora de atributo ‘Administrador’.
Por mais estrando que pareça sempre que há um método construtor dentro de uma classe, esse é lido e interpretado por primeiro, ignorando até mesmo linhas de código anteriores a ele.
Pela leitura léxica do interpretador, é feita a leitura linha após linha, porém a prioridade é processar o método construtor dentro da estrutura da classe.
Na sequência é criada uma variável que instancia a classe Pessoa. Por meio da nossa função print( ), passando como parâmetro usuario1.nome o retorno será Administrador (instância do método construtor), passando como parâmetro Pessoa.nome, o retorno será Padrão (objeto de classe).
Então, para evitar confusão é interessante simplesmente evitar criar objetos de classe de mesmo nome, ou ao menos não confundir o uso dos mesmos na hora de incorporá-los ao restante do código.