5
respostas

Erro de setter.

meu código está idêntico ao do professo e está dando erro no pyCharm:

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)

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

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

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

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

Olá Pablo, qual erro? Pode copiar e colar aqui para que a gente ajude?

Meu código:

class Conta:
    def __init__(self, numero, usuario, saldo, limite):
        print("criando conta....")
        self.__numero = numero
        self.__usuario = usuario
        self.__saldo = saldo
        self.__limite = limite

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

    def __valor_limite_sacar(self, valor_a_sacar):
        limite_saque = self.saldo + self.__limite
        return valor_a_sacar <= limite_saque

    def set_add_saldo(self, valor):
        if(self.__valor_limite_sacar(valor)):
            self.__saldo += valor
        else:
            print("limite insuficiente:", self.__limite)

    def set_rem_saldo(self, dinheiro):
        self.__saldo -= dinheiro

    def transeferir(self, valor, conta_alvo):
        self.set_rem_saldo(valor)
        conta_alvo.add_dinheiro(valor)

    def get_titular(self, titular):
        return self.__usuario

    def get_numero(self):
        return self.__numero

    def get_limite(self):
        return self.__limite

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

erro:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "~\PyCharm Community Edition 2019.3.3\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_import_hook.py", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
  File "~\pablo\PycharmProjects\OO\classes.py", line 1, in <module>
    class Conta:
  File "~\pablo\PycharmProjects\OO\classes.py", line 39, in Conta
    @limite.setter
NameError: name 'limite' is not defined

Olá Pablo.

Para utilizar o @limite.setter dessa maneira:

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

Você obrigatoriamente deve ter um @property com esse nome, no caso limite, então para resolver, basta substituir o seu get_limite(self)

def get_limite(self):
        return self.__limite

Por um que utilize @property como abaixo:

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

Espero ter ajudado, qualquer duvida, não hesite em perguntar.

Bons Estudos.

entendi.

Então para definir setter, o getter tem que estar como propriedade também? visto que o atributo é utilizado nos 2 casos...

Olá Pablo.

É isso mesmo, você consegue usar o @property sozinho, mas para utilizar o setter como @nome_que_utilizou_no_property.setter você obrigatoriamente tem que ter feito o @property.

Com o property você consegue acessar a variável e com o setter você consegue utilizar o operador = junto com a variável que utilizou no property.