Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Encapsulamento do código

Boa noite. Estudo python há algum tempo, e ate hoje nao entendi bem a mecânica do getter e do setter, principalmente do setter. Após algumas pesquisas percebi q vários programadores não gostam dessa prática. Poderia me explicar melhor essas mecânicas e se posso continuar minha carreira sem utiliza las?

3 respostas

O getter é feito pra você retornar ao usuario da classe um atributo x pro usuario sem afetar a classe ou de uma maneira melhor pro usuario e o setter é feito pra adicionar algo a classe sem causar problemas a classe. Por exemplo:

from re import findall


class NumberInString():

    def __init__(self, string):
        self.__string = string

    def remove_numbers(self):
        self.__string = self.__string.strip(str().join(self.__has_number()))
        return self.__string

    def __has_number(self):
        pattern = '[0-9]'
        find_numbers = findall(pattern, self.__string)
        return find_numbers

    @property
    def string(self):
        return self.__string

    @string.setter
    def string(self, string):
        self.__string = string

Nessa função simples eu consigo criar a string sem ser um str, mas se eu coloco no setter um verificador de se é uma string ou não eu consigo validar que sempre vou estar recebendo uma string e o código não vai quebrar:

@string.setter
    def string(self, string):
        if type(string) != str:
            raise ValueError("We just accept strings in this variable.")
        else:
            self.__string = string

>>>from example import NumberInString as nis
>>>string1 = nis("abcs123")
>>>string1.string = 1
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Users\Luige\PycharmProjects\example\tests.py", line 25, in string
    raise ValueError("We just accept strings in this variable.")
ValueError: We just accept strings in this variable.
>>>string1.string = "1"

Mesma coisa no getter, eu posso fazer o getter retornar como algo que é esperado pelo usuario como por exemplo um json ou qualquer outra coisa.

@property
    def string(self):
        return {"string":self.__string}

>>>from example import NumberInString as nis
>>>string1 = nis("abc1123")
>>>string1.remove_numbers()
'abc'
>>>string1.string
{'string': 'abc'}

Sempre vão existir pessoas que gostam e que não gostam de todas as coisas. Assim como vai ter pessoa falando que em 2021 vale mais a pena fazer um site usando html e css puro ao invés de acelerar o processo usando bibliotecas e outras linguagens. Cabe a você decidir o que vai ser melhor pra você de acordo com seu contexto e analizar o que você quer e o que você precisa. Não siga cegamente a opnião de ninguém, analize, absorva e tire a sua própria. Não existe certo e errado, ta todo mundo fazendo a mesma coisa cada um do seu jeito, melhor e pior é questão de perspectiva e propósito.

De qualquer forma se quiser aprender mais sobre classes e formas pythonicas de fazer as coisas te recomendo esse video (em inglês) que é excelente.

Agradeço. A lógica do Setter para mim ainda é meio obscuro, mais tarde assistirem o vídeo

solução!

O setter é pra você definir o valor de uma variavel privada sem quebrar a privacidade e você também tem a opção de colocar mais coisas dentro da função de setter como por exemplo um verificador de se o novo valor atribuido corresponde ao tipo de valor que você esperava