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

Problema no método saldo()

Boa tarde, segue minha classe Conta:


class Conta:

    def __init__(self, numero, titular, saldo = 0.0, limite=1000.0):
        print(f"Construindo objeto...{self}")
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite

    def extrato(self):
            print(f"Saldo {self.saldo} do titular {self.titular}")

    def deposita(self, valor):
        self.__saldo += valor

    def saca(self, valor):
        if valor <= (self.__saldo + self.__limite):
            self.__saldo -= valor
        else:
            print(f"O valor {valor} passou do limite")

    def transfere(self, valor, destino):
        self.saca(valor)
        destino.deposita(valor)

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

    @property
    def titular(self):
        return self.__titular

    @property
    def limite(self):
        return self.__limite

    @limite.setter
    def limite(self, limite):
        self.__limite = limite

meu problema é que quando eu chamo:

conta = Conta(123, "Nico", 55.5)
conta.saca(5000.0)
conta.saldo()

acontece um erro na linha que chamo o método saldo():

Construindo objeto...<conta.Conta object at 0x00000000028B89B0>
O valor 5000.0 passou do limite
Traceback (most recent call last):
  File "C:/Users/PC-1/Documents/fellipe/python/oo/teste.py", line 7, in <module>
    conta.saldo()
TypeError: 'float' object is not callable

Gostaria de saber se alguém poderia me informar o que estou fazendo de errado por favor?

4 respostas
solução!

Oi, Fellipe! O que acontece é que saldo não é um método, é uma property! Na prática, é um atributo normal. É só você fazer:

print(conta.saldo)

Você definiu saldo como property e não como método. Como property, ele não recebe parâmetro nenhum. Assemelha-se a um atributo.

Lembre-se que atributos não recebem parâmetros. Métodos que recebem parâmetros. Ao definir saldo como @property você o tornou equivalente a um atributo.

Experimente apagar a linha @property acima de def saldo(self): e chamar a linha conta.saldo() no console. Dessa forma você definiu novamente que saldo era um método e o Python não gerou erro. Ao definir como property, saldo não recebe parâmetro algum, por isso o erro.

Olá fellipe, isso acontece porque saldo não é um método e sim uma propriedade da classe Conta e deve ser chamado como tal (através do operador "."):

    print(conta.saldo)

Você pode ler mais sobre properties neste link: https://python101.pythonlibrary.org/chapter25_decorators.html#python-properties

O funcionamento de propriedades é muito parecido com getters and setters utilizados em outras linguagens mas não são consideradas métodos.

Espero ter ajudo e bons estudos!

Felipe,

Acho que vc fez alguma confusão, pois, nem tinha limite para sacar 5000.00, pois vc estava usando o valor padrão de 1000.0 no limite. Deveria ter aparecido, "O valor 5000.0 passou do limite". Pode usar sem parênteses que funciona, não é método, é sim atributo!

>>> conta = Conta(123, "Nico", 55.5)
Construindo objeto...<__main__.Conta object at 0x0000024B56BFB0B8>
>>> conta.saca(5000.0)
O valor 5000.0 passou do limite
>>> conta.saldo()
Traceback (most recent call last):
  File "<pyshell>", line 1, in <module>
TypeError: 'float' object is not callable
>>> conta.saldo
55.5
>>>