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

"Duplicação" de print ao implementar o código

Estou implementando o código do módulo 4, encapsulamento, do curso Python: Entendendo a Orientação a Objetos. Estou adicionando alguns prints para que não tenha que repetir processos de validação no teste do código, e me deparei com algo interessante na interação entre os métodos "transfere", "saca" e "deposita:

Corte da parte do código

Por ter atribuído prints nos métodos "saca" e "deposita", ao chamar o "transfere" acontece o seguinte:

Print do console

Os prints dos métodos "saca" e "deposita" vêm juntos na execução do "transfere". Existe alguma maneira de fazer com que eles não sejam printados? Desde já agradeço!

2 respostas

Código completo

class Conta:
    def __init__(self, nome, titular, saldo, limitedep):
        print("Construindo objeto... {}".format(self))
        self.__nome = nome
        self.__titular = titular
        self.__saldo = saldo
        self.__limitedep = limitedep

    def extrato(self):
        print("Titular {} | Saldo da conta: R${} ".format(self.__titular, self.__saldo))

    def deposita(self, valor):
        if self.__limitedep < valor:
            print("Valor máximo de depósito excedido!!!")
        else:
            self.__saldo += valor
            print("Valor depositado: R${}".format(valor))

    def saca(self, valor):
        if self.__saldo < valor:
            print("Saldo insuficiente!!!")
        else:
            self.__saldo -= valor
            print("Saque efetuado: R${}".format(valor))


    def transfere(self, valor, destino):
        self.saca(valor)
        destino.deposita(valor)
        print("Transferência realizada com sucesso!!!")
        print("Valor de tranferência: R${}".format(valor))
solução!

Olá, João. Tudo belezinha?

Ao executar o método transfere, ele chama os métodos saca e deposita. Por isso esses prints são exibidos.

Uma forma de resolver isso pode ser a adição de um parâmetro booleano nos métodos saca e deposita, que seria usado para dizer se o print deve ser executado ou não. Algo como o código a seguir:

    def deposita(self, valor, printa=True):
        if self.__limitedep < valor:
            print("Valor máximo de depósito excedido!!!")
        else:
            self.__saldo += valor
            if(printa == True):
                print("Valor depositado: R${}".format(valor))
                
    def saca(self, valor, printa=True):
        if self.__saldo < valor:
            print("Saldo insuficiente!!!")
        else:
            self.__saldo -= valor
            if(printa == True):
                print("Saque efetuado: R${}".format(valor))

Assim, quando você chamar esses métodos no método transfere, basta passar esse valor de printa como False:

    def transfere(self, valor, destino):
        self.saca(valor, False)
        destino.deposita(valor, False)
        print("Transferência realizada com sucesso!!!")
        print("Valor de tranferência: R${}".format(valor))

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Abraços. Bons estudos!

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