Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida sobre getter and setters.

Estou com uma pulga atrás da orelha a algum tempo nessas aulas de orientação a objeto. Vamos supor uma Classe "Livro" que tenha somente o parâmetro "nome".

class Livro:
    def __init__(self, nome):
        self.nome = nome

livro1 = Livro("Harry Potter")

print(livro1.nome)

Agora vamos transformar esse parâmetro em privado, para não ter problemas sobrescrever sem utilização de um método na classe:

class Livro:
    def __init__(self, nome):
        self.__nome = nome
    @property
    def nome(self):
        return self.__nome

    @nome.setter
    def nome(self, nome):
        self.__nome = nome

livro1 = Livro("Harry Potter")

print(livro1.nome)

No fim, eu acesso o nome do livro da mesma forma, "livro1.nome". Parece que damos uma grande volta no código sem agregar nada realmente útil. A questão é, eu devo utilizar um método somente quando queira estipular regras no input (exemplo, no setter definir que o nome de ver nome.title() )??

1 resposta
solução!

Olá Thiago, tudo bem com você?

O decorator @property corresponde a função property() do python, quando usamos ela como decorator estamos adicionando funcionalidades “especiais” a um método, fazendo ele agir como getters ou setters sem precisar mudar sua sintaxe.

Para usarmos o @property temos que seguir algumas regras.

  • Podemos trabalhar com apenas o @property, ou seja apenas com um método que retorna algo (getter).
  • Para termos um método do tipo setter, temos que ter declarado antes um método do tipo @property.

Agora analisaremos a classe Livro, após realizarmos a definição do atributo __nome como um atributo privado será necessário criarmos os métodos com os decoradores para acessarmos o atributo, como apresentado no código.

Como o nome do método e o nome do atributo são os mesmo, farei a adição de dois prints para informar de onde vem o resultado da nossa operação. O código ficará da seguinte forma.

class Livro:
    def __init__(self, nome):
        self.__nome = nome

    @property
    def nome(self):
        print("Acessando nome pelo @property")
        return self.__nome

    @nome.setter
    def nome(self, nome):
        print("Mudando o nome pelo @nome.setter")
        self.__nome = nome

livro1 = Livro("Harry Potter")
print(livro1.nome)
livro1.nome = "Animais fantástico"
print(livro1.nome)

Resultado

Acessando nome pelo @property
Harry Potter
Mudando o nome pelo @nome.setter
Acessando nome pelo @property
Animais fantástico

Note que nesse momento o atributo está sendo acessado pelo método, não diretamente, é imprimido a mensagem Acessando nome pelo @property, mensagem essa presente no método nome. O mesmo acontece quando utilizamos o método com o decorator @nome.setter.

O uso do decorato @property permite-nos acessarmos um método como um atributo de um objeto. Devido o nome do método e o nome do atributo serem iguais, podemos ter a impressão de que estamos acessando um atributo diretamente.

Para saber um pouco mais sobre o uso dos @property, recomendo a leitura dos seguintes artigos que abordam sobre como utilizar e onde fazer o uso dos @property.

Os artigos acima estão em inglês, caso tenha dificuldade com o idioma recomendo o uso do tradutor do navegador.

Caso tenha dúvidas, encontro à disposição.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!