Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

NameError: name 'limite' is not defined

Toda vez que tento rodar no console aparece essa mensagem. O estranho é que sem o "@limite.setter" ele roda. Não entendi nada.

class Conta: def init(self, numero, titular, saldo, limite): 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)
@property
def saldo(self):
    return self.__saldo

@property
def titular(self):
    return self.__titular

@property
def numero(self):
    return self.__numero

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

Enfrentei o mesmo problema no Jupyter Notebook, no PyCharm foi de boa. Estou curioso por essa resposta também :-)

Prezados amigos,

São erros de digitação nas linhas abaixo indicadas

class Conta:

    def __init__(self, numero, titular, saldo, limite): # Linha com erro de digitação
        print("Construindo objeto ... {}".format(self)) # Linha com erro de digitação
        self.__numero = numero                          # Linha com erro de digitação
        self.__titular = titular                        # Linha com erro de digitação
        self.__saldo = saldo                            # Linha com erro de digitação
        self.__limite = limite                          # Linha com erro de digitação

    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)

    @property
    def saldo(self):
        return self.__saldo

    @property
    def titular(self):
        return self.__titular

    @property
    def limite(self):                    # Linha com erro de digitação, ao contrario de      
        return self.__limite        # numero o certo e: limite

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

Welton, no meu arquivo optei por deixar o 'numero'. Porém, seguindo seu conselho, eu adicionei :

@property

def limite(self):
    return self.__limite

e de fato, rodou. A pergunta que faço é: porque pra fazer funcionar o:

@limite.setter

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

eu tenho que antes colocar o @property do "limite"? Essa obrigatoriedade não tinha ficado clara para mim ao assistir os vídeos.

O meu problema é com o setters, mas apenas no jupyter notebook.

solução

Olá Jonatas.

É isso mesmo, só podemos utilizar o setter se tivermos utilizado o @property, já que essa funcionalidade de getter, setter, and deleter são metodos do objeto property, algo que podemos ver com mais detalhes na documentação.

Então a solução do Welton está correta e a unica possível para a utilização do decorator setter:

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

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

Espero ter ajudado a esclarecer sua duvida, bons estudos.