Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Tenho uma dúvida sobre organização

Acabei me empolgando e fiz um método pra saber o histórico como em um extrato convencional, substitui o self.extrato( ) por self.saldo( ) para saber o saldo da conta, fiz uma atributo a mais chamado memoria que guarda o histórico da conta. Fazendo isso não posso mais usar self.saque( ) nem self.deposito dentro da transferência, pois eles guardariam na memoria itens a mais do que o esperado, agora o que pareceu mais organizado foi recriar eles dentro da transferência, na minha cabeça pelo menos. Gostaria de saber qual e mais organizado na opinião de alguém mais experiente, recriar isso fora ou dentro da Transferência, ou usar outro método pra isso.

class Conta:
    def __init__(self, numero, titular, saldo, limite):

        self.__numero = numero
        self.__titular = titular
        self.__saldo = saldo
        self.__limite = limite
        self.__memoria = []

    def guardar_namemoria(self, item):

        self.__memoria.append(item)

    def saldo(self):

        print(f'O saldo de {self.__titular} e de {self.__saldo}')

    def extrato(self):
        x = 0
        for historico in self.__memoria:
            x += 1
            print(x, historico)
        self.saldo()

    def deposita(self, valor):

        self.__saldo += valor
        self.__memoria.append(f"Deposito realizado {valor}")

    def saque(self, valor):

        if valor > self.__limite:

            print("Saque negado, ultrapassa o limite")

        else:

            self.__saldo -= valor

            self.__memoria.append(f"Saque realizado {valor}")

    def tranasferir(self, valor, destino):

        if self.__saldo > valor > self.__limite:

            print("Saque negado, ultrapassa o limite")

        else:
            # sacando valor da conta que transferiu

            self.__saldo -= valor
            self.__memoria.append(f"Voce transferiu {valor} para {destino.__titular}")

            #dando o valor para outra conta

            destino.__saldo += valor
            destino.__memoria.append(f"Recebeu  {valor} de {self.__titular}")



1 resposta
solução!

Olá, Daniel Mendonça Coêlho .

Não sei se entendi perfeitamente o que você pretende fazer, mas acho que seria basicamente criar um histórico de transações.

Se for isso mesmo, eu faria da seguinte maneira...

  1. Criaria uma classe Extrato. ` class Extrato: def init(self):

     self.__historico = []

    def adiciona(self, transacao):

     self.__historico.append(transacao)
def getHistorico(self):
    return self.__historico


2. Criaria a classe Extrato, que seria uma coleção de transações

from datetime import datetime

class Transacao: TRANSFERENCIA_ENVIADA = 1 TRANSFERENCIA_RECEBIDA = 2 DEPOSITO = 3 SAQUE = 4

def __init__(self, tipo , valor, de, para = None):
    self.__data = datetime.now()
    self.__tipo = tipo
    self.__valor = valor
    self.__de = de
    if tipo == Transacao.TRANSFERENCIA_ENVIADA or tipo == Transacao.TRANSFERENCIA_RECEBIDA:
        self.__para = para

def __str__(self) -> str:
    if self.__tipo == Transacao.TRANSFERENCIA_ENVIADA:
        return f"{self.getDataFormatada()} - Transferência de R$ {self.__valor} enviada para {self.__para.getTitular().getNome()}"
    elif self.__tipo == Transacao.TRANSFERENCIA_RECEBIDA:
        return f"{self.getDataFormatada()} - Transferência de R$ {self.__valor} recebida de {self.__de.getTitular().getNome()}"
    elif self.__tipo == Transacao.DEPOSITO:
        return f"{self.getDataFormatada()} - Depósito de {self.__valor}"
    elif self.__tipo == Transacao.SAQUE:
        return f"{self.getDataFormatada()} - Saque de {self.__valor}"

def getDataFormatada(self):
    return self.__data.strftime("%d/%m/%Y %H:%M:%S")

3. Por fim, eu mudaria um pouco o código que você compartilhou.

from Extrato import Extrato from Transacao import Transacao

class Conta: def init(self, numero, titular, saldo, limite):

    self.__numero = numero
    self.__titular = titular
    self.__saldo = saldo
    self.__limite = limite
    self.__memoria = Extrato()

def getTitular(self):
    return self.__titular

def saldo(self):
    print(f'O saldo de {self.__titular.getNome()} e de R$ {self.__saldo}')

def extrato(self):
    for transacao in self.__memoria.getHistorico():
        print(transacao)
    self.saldo()

def deposita(self, valor):

    self.__saldo += valor
    transacao = Transacao(Transacao.DEPOSITO, valor, self)
    self.__memoria.adiciona(transacao)


def saque(self, valor):

    if valor > self.__limite:

        print("Saque negado, ultrapassa o limite")

    else:

        self.__saldo -= valor

        transacao = Transacao(Transacao.SAQUE, valor, self)
        self.__memoria.adiciona(transacao)

def transferir(self, valor, destino):

    if self.__saldo > valor > self.__limite:

        print("Saque negado, ultrapassa o limite")

    else:
        # sacando valor da conta que transferiu

        self.__saldo -= valor

        #dando o valor para outra conta

        destino.__saldo += valor

        transacao = Transacao(Transacao.TRANSFERENCIA_ENVIADA, valor, self, destino)
        self.__memoria.adiciona(transacao)
        transacao = Transacao(Transacao.TRANSFERENCIA_RECEBIDA, valor, self, destino)
        destino.__memoria.adiciona(transacao)

`

As mudanção que eu fiz foram bem singelas. Eu corrigi um pequeno errinho de digitação no método transferir() Rsrs' e mudei um pouco a lógica de sua classe.

Vou lista abaixo as alterações:

  • Alterei o atributo memoria, tornando-o um objeto do tipo Extrato;
  • Excluí seu método "guardar_namemoria()"
  • Instanciei um objeto do tipo Transacao em cada um dos métodos saque(), transferir() e depositar()
  • Chamei o método adiciona() do meu objeto do tipo Extrato passando como parâmetro o objeto de Transacao anteriormente criado.

No geral, foi isso...

Você está indo muito bem nos estudo e algumas coisas você vai pegando com o tempo!

Gostaria só de te sugerir que revisitasse o código e tentasse padronizar a forma como o faz. Por exemplo, tem alguns métodos que estão no infinitivo e outros não. Mas como falei, isso é com tempo.

É isso.. espero ter ajudado!!!

Se quiser, baixa o código aqui