Coletânea Python do ZERO às Redes Neurais Artificiais
Getters e Setters
Anteriormente vimos rapidamente que é perfeitamente possível criarmos
estruturas condicionais em nossos métodos de classe, para que dessa forma tenhamos estruturas de código que tentam contornar as possíveis exceções cometidas pelo usuário (normalmente essas exceções são inserções de tipos de dados não esperados pelo interpretador).
Aprofundando um pouco mais dentro desse conceito, podemos criar estruturas de validação que contornem erros em atributos de uma classe. Pela nomenclatura usual, um Getter obtém um determinado dado/valor e um Setter configura um determinado dado/valor que substituirá o primeiro.
Como sempre, o processo se inicia com a criação de nossa classe, nesse caso, de nome Produto, dentro dela criamos um construtor onde basicamente iremos criar objetos fornecendo o nome e o preço do mesmo para suas respectivas variáveis.
De fora da classe, criamos uma variável de nome produto1 que recebe como atributo a classe Produto passando como atributos ‘Processador’, 370.
Por meio do comando print( ) podemos exibir por exemplo, o preço de produto1, por meio de produto1.preco. Neste caso o retorno será 370
Na sequência adicionamos um método de classe de nome desconto responsável por aplicar um desconto com base no percentual definido pelo usuário. Também cadastramos um segundo produto e note que aqui estamos simulando uma exceção no valor atribuído ao preço do mesmo.
Já que será executada uma operação matemática para aplicar desconto sobre os valores originais, o interpretador espera que todos dados a serem processados sejam do tipo int ou float (numéricos).
Ao tentar executar tal função ocorrerá um erro: TypeError: can't multiply sequence by non-int of type 'float'.
Em tradução livre: Erro de tipo: Não se pode multiplicar uma sequência de não-inteiros pelo tipo ‘float’ (número com casas decimais).
Sendo assim, teremos de criar uma estrutura de validação que irá prever esse tipo de exceção e contornar a mesma, como estamos trabalhando com orientação a objetos, mais especificamente tendo que criar um validador dentro de uma classe, isto se dará por meio de Getters e Setters.
Prosseguindo com nosso código, indentado como método de nossa classe Pessoa, iremos incorporar ao código a estrutura acima.
Inicialmente criamos o que será nosso Getter, um decorador (que por sua vez terá prioridade 1 na leitura do interpretador) que cria uma função preco, simplesmente obtendo o valor atribuído a preco e o replicando em uma nova variável de nome preco_valido.
Feito isso, hora de criarmos nosso Setter, um pouco mais complexo, porém um tipo de validador funcional. Inicialmente criamos um decorador de nome @preco.setter (esse decorador deverá ter o nome da variável em questão, assim como a palavra reservada .setter).
Então criamos a função preco que recebe um valor, em seguida é criada uma estrutura condicional onde, se o valor da instância for do tipo str, valor será convertido para float assim como os caracteres desnecessários serão removidos.
Por fim, preco_valido é atualizado com o valor de valor.
Realizadas as devidas correções e validações, é aplicado sobre o preço de produto1 um desconto de 15%, e sobre o preço de produto2 20%. Desta forma, o retorno será de: 314.5
224.0