Coletânea Python do ZERO às Redes Neurais Artificiais
Método construtor de uma classe
Quando estamos trabalhando com classes simples, como as vistas
anteriormente, não há uma real necessidade de se criar um construtor para as mesmas.
Na verdade, internamente esta estrutura é automaticamente gerada, o chamado construtor é criado manualmente quando necessitamos parametrizá-lo manualmente de alguma forma, criando estruturas que podem ser instanciadas e receber atribuições de fora da classe.
Para alguns autores, esse processo é chamado de método construtor, para outros de método inicializador, independente do nome, este é um método (uma função interna) que recebe parâmetros (atributos de classe) que se tornarão variáveis internas desta função, guardando dados/valores a serem passados pelo usuário por meio da variável que instanciar essa classe.
Em outras palavras, nesse exemplo, do corpo do código, uma variável/objeto que instanciar a classe Pessoa terá de passar os dados referentes a nome, idade, sexo e altura, já que o método construtor dessa classe está esperando que estes dados sejam fornecidos.
Ainda trabalhando sobre o exemplo da classe Pessoa, note que agora criamos uma função interna de nome __init__(self), palavra reservada ao sistema para uma função que inicializa dentro da classe algum tipo de função.
Em sua IDE, você notará que ao digitar __init__ automaticamente ele criará o parâmetro (self), isto se dá porque tudo o que estiver indentado a essa função será executado internamente e associado a variável que é a instância desta classe (a variável do corpo geral do código que tem esta classe como atributo).
Da mesma forma que uma função convencional, os nomes inseridos como parâmetro serão variáveis temporárias que receberão algum dado ou valor fornecido pelo usuário, normalmente chamados de atributos de classe.
Repare que neste exemplo estão sendo criadas variáveis (atributos de classe) para armazenar o nome, a idade, o sexo e a altura. Internamente, para que isto se torne variáveis instanciáveis, é criada uma estrutura self.nomedavariavel que recebe como atributo o dado ou valor inserido pelo usuário, respeitando inclusive, a ordem em que foram parametrizados.
Dessa forma, é criada a variável pessoa1 que recebe como atributo a classe Pessoa, que por sua vez tem os parâmetros ‘Fernando’, 32, ‘M’, 1.90. Estes parâmetros serão substituídos internamente, ordenadamente, pelos campos referentes aos mesmos.
O self nunca receberá atribuição ou será substituído, ele é apenas a referência de que estes dados serão guardados dentro e para a classe, mas para nome será atribuído ‘Fernando’, para idade será atribuído 32, para o sexo será atribuído M e por fim para a altura será atribuído o valor de 1.90.
A partir deste momento, podemos normalmente instanciarmos qualquer dado ou valor que está guardado na classe Pessoa.
Por meio da função print( ) passando como parâmetros pessoa1.nome e pessoa1.idade, o retorno será: Fernando, 32.
Apenas a nível de curiosidade, a partir do momento que temos variáveis internas a uma classe, com seus devidos atributos, podemos usá-los normalmente de fora da classe, no exemplo acima, criando uma mensagem usando de f strings e máscaras de substituição normalmente.
Neste caso o retorno será: Bem vindo Fernando, parabéns pelos seus 32 anos!!!
A questão da declaração de parâmetros, que internamente farão a composição das variáveis homônimas, devem respeitar a estrutura self.nomedavariavel, porém dentro do mesmo escopo, da mesma indentação, é perfeitamente normal criar variáveis independentes para guardar algum dado ou valor dentro de si.