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

properties e setters

Olá,

Estou com dúvida sobre como funcionam essas @property e @property.setter O que esse comando (@property) faz no código? Qual a diferença de eu usar um código como:

    @property
    def saldo(self):
        return self.__saldo

ou um código como:

    def saldo(self):
        return self.__saldo

E para ser acessada e alterar um valor, uma @property.setter precisa ter o mesmo nome de uma @property, que já tenha sido definida antes no código?

2 respostas
solução!

Olá Felipe, o que muda é a chamada. Se você utilizar sem @property, assim:

class Conta:
    def saldo(self):
        return self.__saldo

Quando você precisar ler o atributo, fará:

c = Conta(100.0)
print(c.saldo())

Veja que você chama um método (saldo()) - por isso em muitas outras linguagens geralmente é usado a nomeclatura de get_saldo() pela semântica. Outra coisa é o setter, que ficaria:

class Conta:
    def saldo(self):
        return self.__saldo

     def saldo(self, saldo):
        return self.__saldo = saldo

Acontece que este último método vai anular o primeiro, já que possuem o mesmo nome. O python não vai acusar erro, mas vai anular o primeiro e sempre vai cobrar que você passe um argumento:

c = Conta(100.0)
print(c.saldo(100.0))

Seria melhor, nesse caso, usar get_saldo() e set_saldo(), pela semântica.

As properties vem para faciliar a chamada e ajudar na legibilidade do código. Seus atributos continuam "privados" e as propriedades vão ajudar na chamada, que será direta, como se os atributos fossem públicos:

class Conta:

    @property
    def saldo(self):
        return self.__saldo

    @saldo.setter
     def saldo(self, saldo):
         return self.__saldo = saldo

E a chamada será muito melhor:

c = Conta(100.0)
print(c.saldo)  # imprime 100.0
c.saldo = 10.0
print(c.saldo) # imprime 10.0

Veja que as propriedades chamam um método por debaixo dos panos (como um get_saldo() e set_saldo()), mas decoram os métodos e acessamos como se fossem atributos públicos. Melhora a legibilidade e uso dos objetos e funciona tanto para leitura print(c.saldo) quanto para escrita c.saldo = 10.0 sem gerar conflitos.

Obrigado Thais, muito clara a sua explicação!!! :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software