2
respostas

Não deu certo com o PyCharm

Tentei acompanhar o professor no Pycharm, porém o metodo que utiliza o attrgetter não encontra o _saldo:

class ContaSalario:

    def __init__(self, codigo):
        self._codigo = codigo
        self._saldo = 0

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

    def __str__(self):
        return "\nCodigo bancário: {} \nSaldo em conta: {}\n".format(self._codigo, self._saldo)

conta1 = ContaSalario(17)
conta1.deposita(1000)

conta2 = ContaSalario(26)
conta2.deposita(3000)

conta3 = ContaSalario(20)
conta3.deposita(4)

contas = [conta1, conta2, conta3]


#def extrai_saldo(conta):
#    return conta._saldo
#for conta in sorted(contas, key=extrai_saldo):
#    print(conta)

from operator import attrgetter
for conta in sorted(contas, key=attrgetter(_saldo)):
    print(conta)
"D:\Arquivos\Cursos\Alura\Python\Codigos Fonte\venv\Scripts\python.exe" "D:/Arquivos/Cursos/Alura/Python/Codigos Fonte/Pt4_Collections/Collections_contas1.py"
Traceback (most recent call last):
  File "D:\Arquivos\Cursos\Alura\Python\Codigos Fonte\Pt4_Collections\Collections_contas1.py", line 31, in <module>
    for conta in sorted(contas, key=attrgetter(_saldo)):
NameError: name '_saldo' is not defined

Process finished with exit code 1

Onde estou errando?

2 respostas

Olá Davidson, tudo bem?

Você errou em uma coisa do seu código, quando queremos criar um atributo privado, devemos colocar depois do self. dois __e não um _, então o seu programa ficaria assim:

class ContaSalario:

    def __init__(self, codigo, saldo=0):
        self.__codigo = codigo
        self.__saldo = saldo

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

    def __str__(self):
        return f"\nCodigo bancário: {self.__codigo} \nSaldo em conta: {self.__saldo}\n"

conta1 = ContaSalario(17)
conta1.deposita(1000)

conta2 = ContaSalario(26)
conta2.deposita(3000)

conta3 = ContaSalario(20)
conta3.deposita(4)

Fiz uma pequena auteração no def __str__(self) usando F string mais nova do Python.

E tirei aquela outra importação feita lá embaixo, pois estava dando problema.

Consertei os seus atributos privados e deixei o saldo como opcional na criação da conta!

Opa, o erro está na falta das aspas @Davidson.

Veja, você colocou desta forma:

"

from operator import attrgetter
for conta in sorted(contas, key=attrgetter(_saldo)):
    print(conta)

"

Deveria conter aspas no "_saldo", ficando desta maneira:

"

for conta in sorted(contas, key=attrgetter("_saldo")):
    print(conta)

"