Coletânea Python do ZERO às Redes Neurais Artificiais

Fernando Feltrin · Capítulo 131 de 287

Páginas do PDF

Coletânea Python do ZERO às Redes Neurais Artificiais

Classes abstratas

 

 

Se você chegou até este tópico do livro certamente não terá nenhum

problema para entender este modelo de classe, uma vez que já o utilizamos implicitamente em outros exemplos anteriores.

O fato é que, como dito desde o início, para alguns autores uma classe seria um molde a ser utilizado para se guardar todo e qualquer tipo de dado associado a um objeto de forma que possa ser utilizado livremente de forma eficiente ao longo do código.

Sendo assim, quando criamos uma classe vazia, ou bastante básica, que serve como base estrutural para outras classes, já estamos trabalhando com uma classe abstrata.

O que faremos agora é definir manualmente este tipo de classe, de forma que sua forma estrutural irá forçar as classes subsequentes a criar suas especializações a partir dela. Pode parecer um tanto confuso, mas com o exemplo tudo ficará mais claro.

Como dito anteriormente, na verdade já trabalhamos com este tipo de

classe, mas de forma implícita e assim o interpretador do Python não gerava nenhuma barreira quanto a execução de uma classe quando a mesma era abstrata.

Agora, usaremos para este exemplo, um módulo do Python que nos obrigará a abstrair manualmente as classes a partir de uma sintaxe própria.

Sendo assim, inicialmente precisamos importar os módulos ABC e abstractmethod da biblioteca abc.

 

Realizadas as devidas importações, podemos prosseguir com o exemplo:

Inicialmente criamos uma classe Pessoa, que já herda ABC em sua declaração, dentro de si, note que é criado um decorador @abstractclassmethod, que por sua vez irá sinalizar ao interpretador que todos os blocos de código que vierem na sequência dessa classe, devem ser sobrescritas em suas respectivas classes filhas dessa hierarquia.

Em outras palavras, Pessoa no momento dessa declaração, possui um método chamado logar que obrigatoriamente deverá ser criado em uma nova classe herdeira, para que possa ser instanciada e realizar suas devidas funções.

Dando sequência, repare que em seguida criamos uma classe Usuario, que herda Pessoa, e dentro de si cria o método logar para sobrepor/sobrescrever o método logar de Pessoa. Este, por sua vez, exibe uma mensagem pré-definida por meio da função print( ).

A partir do momento que Pessoa é identificada como uma classe abstrata por nosso decorador, a mesma passa a ser literalmente apenas um molde.

Seguindo com o exemplo, tentando fazer a associação que estamos acostumados a fazer, atribuindo essa classe a um objeto qualquer, ao tentar executar a mesma será gerado um erro de interpretação.

Mensagem de erro, em tradução livre: Não é possível inicializar a classe abstrata Pessoa com o método abstrato logar.

Porém instanciando Usuario, que herda Pessoa, ao tentar executar o método de classe logar que consta no corpo do mesmo, este funciona perfeitamente.

Nesse caso o retorno será: Usuario logado no sistema

Sendo assim, o que precisa ficar bem claro, inicialmente, é que uma das formas que temos de proteger uma classe que apenas nos serve de molde, para que essa seja herdada, mas não sobrescrita, é definindo a mesma manualmente como uma classe abstrata.