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

[Dúvida] Continua passando do limite

Notei que meu código continua sacando o dinheiro....

class Conta:
    def __init__(self,numero, titular, saldo, limite):
        print(f'Construindo objeto... {self}')
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite
        self.__saldo_limite = saldo + limite


    def extrato(self):
        print(f'Olá, {self.__titular} o seu saldo é de R$:{self.__saldo}')

    def depositar(self, valor):
        validar_valor = valor > 0

        if(validar_valor):
            self.__saldo += valor
        else:
            print('Valor inválido')

    def __pode_sacar(self, valor):
        valor_a_sacar = self.__saldo_limite >= valor
        return valor_a_sacar

    def sacar(self, valor):
        if(self.__pode_sacar(valor)):
            self.__saldo -= valor
        else:
            print('Valor inválido')

    def transferir(self, valor, conta):
        validar_saldo_e_limite = (self.__saldo + self.limite) >= valor

        if(validar_saldo_e_limite):
            self.sacar(valor)
            conta.depositar(valor)

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

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

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

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

classe teste.....

from conta import Conta

def cria_conta(numero, titular, saldo, limite):
    conta = {"numero": numero, "titular": titular, "saldo": saldo, "limite": limite}
    return conta

conta = Conta(123, "NICO", 100.00, 1000.0)
conta2 = Conta(1233, "Manoel", 200.00, 1500.0)

conta.extrato()
conta.depositar(50)
conta.extrato()
conta.sacar(50)
conta.extrato()
conta.sacar(1056.0)
conta.extrato()
conta.sacar(1155.0)
conta.extrato()
print('+--------------------------------------+')
conta2.extrato()
conta2.depositar(50)
conta2.extrato()
conta2.sacar(50)
conta2.extrato()
conta2.sacar(1700.0)
conta2.extrato()
conta2.sacar(1700.0)
conta2.extrato()

Saída é Olá, Manoel o seu saldo é de R$:-3200.0;

Agora se eu colocar 1700.01 ai ele aparece (Valor inválido)


joguei no terminal igual o professor....


>>> from conta import Conta
>>> conta2 = Conta(1233, "Manoel", 200.00, 1500.0)
Construindo objeto... <conta.Conta object at 0x00000267B7907D60>
>>> conta2.sacar(1500)
>>> conta2.extrato()  
Olá, Manoel o seu saldo é de R$:-1300.0
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.sacar(1500)
>>> conta2.extrato()
Olá, Manoel o seu saldo é de R$:-23800.0
3 respostas

Olá Caio, tudo bem com você?

A classe permanece sacando os valores acima do limite devido a lógica utilizada para a validação criada para o método __pode_sacar.

Nesse método está sendo realizado uma validação entre o atributo self.__saldo_limite e o valor que o usuário está indo sacar. Note que o atributo __saldo_limite recebe seu valor no momento em que a classe é inicializada, mas, à medida que realizamos saques seu valor não é modificado, assim, no momento da validação do saque com o método __pode_sacar, será considerado que ainda há saldo suficiente para saque.

Para que o código funcione com a lógica correta, será necessário modificarmos o método, __pode_sacar, assim sempre que houver a tentativa de saque de valores maiores que a soma do saldo e o limite será apresentado a mensagem Valor inválido presente no método sacar.

Deixo abaixo a declaração do método __pode_sacar.

    def __pode_sacar(self, valor):
        valor_a_sacar = self.__saldo + self.__limite
        return valor <= valor_a_sacar

Declarando o método __pode_sacar como apresentado acima, após a realização do primeiro saque o valor do saldo será atualizado, algo que não acontecia anteriormente, assim não será mais possível sacar valores acima da soma do limite mais o saldo.

Lembre-se que pode contar sempre com o fórum Alura, seja para tirar suas dúvidas ou para compartilhar o seu desenvolvimento.

Fico à disposição.

Abraços e bons estudos.

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

Olá, o código foi modificado, mas apresenta o mesmo erro segue ele modificado abaixo:


class Conta:
    def __init__(self,numero, titular, saldo, limite):
        print(f'Construindo objeto... {self}')
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite
        self.__saldo_limite = saldo + limite

    def extrato(self):
        print(f'Olá, {self.__titular} o seu saldo é de R$:{self.__saldo}')

    def depositar(self, valor):
        validar_valor = valor > 0

        if(validar_valor):
            self.__saldo += valor
        else:
            print('Valor inválido')

    def __pode_sacar(self, valor):
        return valor <= self.__saldo_limite

    def sacar(self, valor):
        if(self.__pode_sacar(valor)):
            self.__saldo -= valor
        else:
            print('Valor inválido')

    def transferir(self, valor, conta):
        validar_saldo_e_limite = (self.__saldo + self.limite) >= valor

        if(validar_saldo_e_limite):
            self.sacar(valor)
            conta.depositar(valor)

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

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

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

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

e o que estou usando seria esse:

from conta import Conta

def cria_conta(numero, titular, saldo, limite):
    conta = {"numero": numero, "titular": titular, "saldo": saldo, "limite": limite}
    return conta

conta = Conta(123, "NICO", 100.00, 1000.0)
conta2 = Conta(1233, "Manoel", 200.00, 1500.0)

conta.extrato()
conta.depositar(50)
conta.extrato()
conta.sacar(50)
conta.extrato()
conta.sacar(1056.0)
conta.extrato()
conta.sacar(1056.0)
conta.extrato()
conta.sacar(1155.0)
conta.extrato()
print('+--------------------------------------+')
conta2.extrato()
conta2.depositar(50)
conta2.extrato()
conta2.sacar(50)
conta2.extrato()
conta2.sacar(1700.00)
conta2.extrato()
conta2.sacar(1701.0)
conta2.extrato()
conta2.sacar(1700.0)
conta2.extrato()

Executo esse código e ele fica assim a saída dele...

PS D:\PyAlura\Python\OO> & C:/Users/Caioc/AppData/Local/Programs/Python/Python310/python.exe d:/PyAlura/Python/OO/teste.py Construindo objeto... <conta.Conta object at 0x0000019DF540BFD0> Construindo objeto... <conta.Conta object at 0x0000019DF540BF40> Olá, NICO o seu saldo é de R$:100.0 Olá, NICO o seu saldo é de R$:150.0 Olá, NICO o seu saldo é de R$:100.0 Olá, NICO o seu saldo é de R$:-956.0 Olá, NICO o seu saldo é de R$:-2012.0 Valor inválido Olá, NICO o seu saldo é de R$:-2012.0 +--------------------------------------+ Olá, Manoel o seu saldo é de R$:200.0 Olá, Manoel o seu saldo é de R$:250.0 Olá, Manoel o seu saldo é de R$:200.0 Olá, Manoel o seu saldo é de R$:-1500.0 Valor inválido Olá, Manoel o seu saldo é de R$:-1500.0 Olá, Manoel o seu saldo é de R$:-3200.0 PS D:\PyAlura\Python\OO>

Ele valida o valor corretamente, mas se eu ficar jogando o valor menor que o valor permitido eu vou ficar sacando infinitamente sendo assim eu acho que estou fazendo alguma coisa de errado ou está faltando mais alguma validação que eu não estou sabendo fazer.

Grato.

solução!

Poderia me dizer o que está diferente esse:


class Conta:
    def __init__(self,numero, titular, saldo, limite):
        print(f'Construindo objeto... {self}')
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite
        self.__saldo_limite = saldo + limite

    def extrato(self):
        print(f'Olá, {self.__titular} o seu saldo é de R$:{self.__saldo}')

    def depositar(self, valor):
        validar_valor = valor > 0

        if(validar_valor):
            self.__saldo += valor
        else:
            print('Valor inválido')

    def __pode_sacar(self, valor):
        return valor <= self.__saldo_limite

    def sacar(self, valor):
        if(self.__pode_sacar(valor)):
            self.__saldo -= valor
        else:
            print('Valor inválido')

    def transferir(self, valor, conta):
        validar_saldo_e_limite = (self.__saldo + self.limite) >= valor

        if(validar_saldo_e_limite):
            self.sacar(valor)
            conta.depositar(valor)

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

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

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

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

Para esse declarei a variável em lugar diferente poderia me informar a razão de um rodar e o outro não?


class Conta:
    def __init__(self,numero, titular, saldo, limite):
        print(f'Construindo objeto... {self}')
        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite

    def extrato(self):
        print(f'Olá, {self.__titular} o seu saldo é de R$:{self.__saldo}')

    def depositar(self, valor):
        validar_valor = valor > 0

        if(validar_valor):
            self.__saldo += valor
        else:
            print('Valor inválido')

    def __pode_sacar(self, valor):
        saldo_limite = self.__saldo + self.__limite
        return valor <= saldo_limite

    def sacar(self, valor):
        if(self.__pode_sacar(valor)):
            self.__saldo -= valor
        else:
            print('Valor inválido')

    def transferir(self, valor, conta):
        validar_saldo_e_limite = (self.__saldo + self.limite) >= valor

        if(validar_saldo_e_limite):
            self.sacar(valor)
            conta.depositar(valor)

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

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

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

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

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