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.