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

[Dúvida] 06 Mão na massa : herança e modularização - Duvida

Criação da Classe Banco

class Banco:
    lista_bancos = []

    def __init__(self, nome="", endereco=""):
        self._nome = nome
        self._endereco = endereco
        Banco.lista_bancos.append(self)

    def __str__(self):
        return f"Nome: {self._nome.ljust(50)} | Endereço: {self._endereco.ljust(30)}"

Criação da classe Agência

from modelos.banco import Banco

class Agencia(Banco):
    def __init__(self, nome, endereco, numero):
        super().__init__(nome, endereco)
        self._numero= numero

    def __str__(self):
        return f"Nome: {self._nome.ljust(50)} | Endereço: {self._endereco.ljust(30)} | Número: {self._numero}"

Função main()

from modelos.banco import Banco
from modelos.agencia import Agencia

# Criação de duas instâncias
banco1=Banco("Banco do Brasil", "Rua 1, nº 34")
agencia1 = Agencia("Banco do Brasil", "Rua 1, nº 34", 1234)
agencia2 = Agencia("Banco do Brasil", "Rua 1, nº 34", 1235)
banco2=Banco("Itaú", "Rua 1, nº35")
agencia1 = Agencia("Itaú", "Rua 1, nº35", 143)
agencia2 = Agencia("Itaú", "Rua 1, nº35", 144)

    def main():
        print(banco1)
        print(agencia1)
        print(agencia2)
        print(banco2)
        print(agencia1)
        print(agencia2)

if __name__ == '__main__':
    main()

Resposta:

"""
Nome: Banco do Brasil                | Endereço: Rua 1, nº 34
Nome: Itaú                                     | Endereço: Rua 1, nº35                    | Número: 143
Nome: Itaú                                     | Endereço: Rua 1, nº35                    | Número: 144
Nome: Itaú                                     | Endereço: Rua 1, nº35
Nome: Itaú                                     | Endereço: Rua 1, nº35                    | Número: 143
Nome: Itaú                                     | Endereço: Rua 1, nº35                    | Número: 144

Com base na resposta, percebi que as variáveis agencia1 e agencia 2 do banco1 foram sobrescritas pelas variáveis agencia1 e agencia2 do banco2. Qual o erro no código para isso ter acontecido.
"""
2 respostas
solução!

Oi, dev! Tudo bem?

As variáveis agencia1 e agencia2 estão sendo sobrescritas porque estamos reutilizando os mesmos nomes de variáveis para instâncias diferentes. Quando criamos uma nova instância com o mesmo nome de uma variável existente, a referência anterior é perdida, e a variável passa a referenciar a nova instância.

Para resolver isso, podemos usar nomes diferentes para as instâncias de Agencia relacionadas aos diferentes bancos, deixando o nosso código de acordo com o exemplo abaixo:

class Banco:
    lista_bancos = []

    def __init__(self, nome="", endereco=""):
        self._nome = nome
        self._endereco = endereco
        Banco.lista_bancos.append(self)

    def __str__(self):
        return f"Nome: {self._nome.ljust(50)} | Endereço: {self._endereco.ljust(30)}"


from modelos.banco import Banco

class Agencia(Banco):
    def __init__(self, nome, endereco, numero):
        super().__init__(nome, endereco)
        self._numero = numero

    def __str__(self):
        return f"Nome: {self._nome.ljust(50)} | Endereço: {self._endereco.ljust(30)} | Número: {self._numero}"


from modelos.banco import Banco
from modelos.agencia import Agencia

# Criação de duas instâncias
banco1 = Banco("Banco do Brasil", "Rua 1, nº 34")
agencia1_banco1 = Agencia("Banco do Brasil", "Rua 1, nº 34", 1234)
agencia2_banco1 = Agencia("Banco do Brasil", "Rua 1, nº 34", 1235)
banco2 = Banco("Itaú", "Rua 1, nº 35")
agencia1_banco2 = Agencia("Itaú", "Rua 1, nº 35", 143)
agencia2_banco2 = Agencia("Itaú", "Rua 1, nº 35", 144)

def main():
    print(banco1)
    print(agencia1_banco1)
    print(agencia2_banco1)
    print(banco2)
    print(agencia1_banco2)
    print(agencia2_banco2)

if __name__ == '__main__':
    main()

Dessa forma, teremos variáveis distintas para cada instância de Agencia, evitando que sejam sobrescritas.

Espero ter ajudado!

Um forte abraço e bons estudos!

Obrigado Sarah!