Coletânea Python do ZERO às Redes Neurais Artificiais

Fernando Feltrin · Capítulo 193 de 287

Páginas do PDF

Coletânea Python do ZERO às Redes Neurais Artificiais

Sobrecarga de Operadores

 

Quando damos nossos primeiros passos no aprendizado do Python, em sua forma básica, programando de forma estruturada, um dos primeiros tópicos que nos é apresentado são os operadores.

Estes por sua vez são símbolos reservados ao sistema que servem para fazer operações lógicas ou aritméticas, de forma que não precisamos programar do zero tais ações, pela sintaxe, basta usar o operador com os tipos de dados aos quais queremos a interação e o interpretador fará a leitura dos mesmos normalmente.

Em outras palavras, se declaramos duas variáveis com números do tipo inteiro, podemos por exemplo, via operador de soma + realizar a soma destes valores, sem a necessidade de programar do zero o que seria uma função que soma dois valores.

Se tratando da programação orientada a objetos, o que ocorre é que quando criamos uma classe com variáveis/objetos dentro dela, estes dados passam a ser um tipo de dado novo, independente, apenas reconhecido pelo interpretador como um objeto.

Para ficar mais claro, raciocine que uma variável normal, com valor atribuído de 4 por exemplo, é automaticamente interpretado por nosso interpretador como int (número inteiro, sem casas decimais), porém a mesma variável, exatamente igual, mas declarada dentro de uma classe, passa a ser apenas um objeto geral para o interpretador.

Números inteiros podem ser somados, subtraídos, multiplicados, elevados a uma determinada potência, etc... um objeto dentro de uma classe não possui essas funcionalidades a não ser que manualmente realizemos a chamada sobrecarga de operadores. Por exemplo:

Aqui propositalmente simulando este erro lógico, inicialmente criamos uma classe de nome Caixa, dentro dela um método construtor que recebe um valor para largura e um para altura, atribuindo esses valores a objetos internos.

No corpo de nosso código, criando variáveis que instanciam nossa classe Caixa e atribuem valores para largura e altura, seria normal raciocinar que seria possível, por exemplo, realizar a soma destes valores.

 

Porém o que ocorre ao tentar realizar uma simples operação de soma entre tais valores o retorno que temos é um traceback.

 

Em tradução livre: Erro de Tipo: tipo de operador não suportado para +: Caixa e Caixa.

 

Repare que o erro em si é que o operador de soma não foi reconhecido como tal, pois esse símbolo de + está fora de contexto uma vez que estamos trabalhando com orientação a objetos.

Sendo assim, o que teremos de fazer é simplesmente buscar os operadores que sejam reconhecidos e processados neste tipo de programação.

Segue uma lista com os operadores mais utilizados, assim como o seu método correspondente para uso em programação orientada a objetos.

 

Dando continuidade a nosso entendimento, uma vez que descobrimos que para cada tipo de operador lógico/aritmético temos um método de classe correspondente, tudo o que teremos de fazer é de fato criar este método dentro de nossa classe, para forçar o interpretador a reconhecer que, nesse exemplo, é possível realizar a soma dos dados/valores atribuídos aos objetos ali instanciados.

 

Retornando ao código, note que simplesmente é criado um método de classe de nome __add__ que recebe como atributos um valor para si e um valor a ser somado neste caso. __add__ é uma palavra reservada ao sistema, logo, o interpretador sabe sua função e a executará normalmente dentro desse bloco de código.

 

Dessa forma, podemos criar normalmente uma função de soma personalizada, note que no método __add__ foi criada uma variável de nome largura1 que guardará o valor da soma entre as larguras dos objetos.

Da mesma forma, altura1 receberá o valor da soma das alturas, tudo isto retornando para a classe tais valores.

Na sequência, apenas para facilitar a visualização, foi criada um método de classe __repr__ (também reservado ao sistema) que irá retornar os valores das somas explicitamente ao usuário (lembre-se de que como estamos trabalhando dentro de uma classe, por padrão esta soma seria uma mecanismo interno, se você tentar printar esses valores sem esta última função, você terá como retorno apenas o objeto, e não seu valor).

 

Por fim, agora instanciando a classe, atribuindo seus respectivos valores, finalmente é possível realizar normalmente a operação de soma entre as variáveis que instanciam essa classe.

Nesse exemplo, criando uma variável de nome caixa3 que recebe como atributo a soma dos valores de largura e altura de caixa1 e caixa2.

 

O retorno, como esperado, será: <class 'Caixa(20, 30)'>.

Encerrando, apenas tenha em mente que, de acordo com a funcionalidade que quer usar em seu código, deve procurar o método equivalente e o declarar dentro da classe como um método de classe qualquer, para “substituir” o operador lógico/aritmético de forma a ser lido e interpretador por nosso interpretador.