4
respostas

@limite.setter dá erro

Olá, não consigo achar meu erro.

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

    def extrato(self):
        print("Saldo de {} do titular {}".format(self.__saldo, self.__titular))

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

    def saca(self, valor):
        self.__saldo -= valor

    def transfere(self, valor, destino):
        self.saca(valor)
        destino.deposita(valor)

    def get_numero(self):
        return self.__numero

    def get_titular(self):
        return self.__titular

    def get_saldo(self):
        return self.__saldo

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

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

No último método, quando eu chamo:

conta.limite = 2000.0

Aparece:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: can't set attribute

O que está errado ?

4 respostas

A forma como resolvi foi alterando o valor, assim:

    @limite.setter
    def limite(self, novo_limite):
        self.__limite = novo_limite

No entanto o professor não fez assim e funcionou. Queria entender pq.

Olá Ana, tudo bem?

Peguei seu código pra testar e descobrir o porque do seu "erro". E ai está a pegadinha, não tem erro! Bem, ao menos não na parte do código.

Então porque não rodou? Essa é fácil, o problema não está no código dessa vez mas sim no compilador. No seu caso você esqueceu de reiniciar o console do python, (ctrl + D se você estiver no terminal, cmd + R no Pycharm se você está em um mac, no windows/linux imagino que seja control + R (você pode clicar no simbolozinho de uma setinha verde saindo de um quadrado e fazendo um retorno tbm se n quiser usar o comando)) como você não tinha reiniciado o console, o python estava pensando que o seu código era assim:


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

    def extrato(self):
        ...

    def deposita(self, valor):
        ...

    def saca(self, valor):
        ...

    def transfere(self, valor, destino):
        ...

    def get_numero(self):
        ...

    def get_titular(self):
        ...

    def get_saldo(self):
        ...

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

Porquê isso acontece? Isso acontece porque, por padrão, o python compila e roda o código que você mandou pra ele na hora que você aperta o "run", depois disso qualquer alteração que você faça no código não vai ser rodada enquanto você não rodar novamente.

Você viu que deu um erro, tentou fazer funcionar ou procurar o erro, mudou o nome e reiniciou o Console antes de rodar com o nome diferente e ao rodar deu tudo certo :)

Inclusive o nome que você coloca ali não faz diferença nenhuma para o python, você poderia colocar def limite (self, batata):, se depois você colocar self.__limite = batata o código vai rodar igual. Esses nomes que nós estamos colocando são pra ter mais semântica e outros humanos entenderem o que está acontecendo ali.

Inclusive se você quiser testar novamente, comente a parte do setter do seu código e coloque pra rodar. Você vai ter esse mesmo erro que teve. Olhe:

class Conta:

    ...

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

    # @limite.setter
    # def limite(self, limite):
    #    self.__limite = limite

Agora no console:

>>> conta.limite = 2000.0
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: can't set attribute

Isso é bem comum de acontecer, principalmente se estamos cansados ou começando a aprender a programar, inclusive tem um caso de um amigo meu que passou horas procurando um problema no código dele quando o problema era que o compilador que ele estava usando estava com um problema, ele tentou rodar em outro programa e deu tudo certo, por isso quando você pega um compilador novo é sempre bom rodar um "hello world" básico só pra ter certeza de que está tudo certo por ali. E é claro, lembrar de salvar o arquivo e reiniciar o console antes de rodar o código :)

Isso pode mesmo ter acontecido, não lembro mais pq faz bastante tempo rsrs

Mas eu copiei o código inicial agora e o Pycharm "reclama" desse código:

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

No @limite.setter ele deixa o nome limite de cor diferente. E quando mudo o parâmetro limite para novo_limite ele para de "reclamar". Python também reconhece boas práticas e por isso deixar como limite não seria uma boa prática ?

Vc tem razão, mesmo sem alterar ele não acusou erro, dessa vez.

limite,setter

Se você estiver falando do limite antes do .setter é assim mesmo, isso é só a forma do pycharm distribuir as cores para tentar facilitar o entendimento do que é o quê.

Se você abrir em outro compilador ou mudar o tema as cores podem se alterar, dependendo de onde você estiver com o código pode até ser que não tenha cor alguma em nada. Mas hoje em dia as IDE's e os Editores de Textos mais usados pra programação costumam ser sempre coloridinhos para facilitar o entendimento do código e a organização de tudo.

Afinal o mais importante atualmente é que todo mundo entenda o que você escreveu ali e o que o código está fazendo, tanto pra você mesma conseguir ler seu código no futuro e entender o que foi feito sem dificuldade quanto pra outros programadores lerem e entenderem seu código, seja pra usa-lo, te ajudar com algo, corrigir algum bug dele, entre outras coisas.

P.S.: Caso não seja sobre isso que você quis dizer manda um print do que aparece ai. Se foi isso mesmo e não tiver mais duvidas fecha o tópico :)