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

decorador com setter não está funcionando

Oi pessoal, tudo bem?

Vi que algumas pessoas tiveram o mesmo problema que eu em outros dois tópicos que estão fechados, mas o problema não foi resolvido.

A questão é que usando o decorator para setter.limite, estou tomando um erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O trecho do meu código que escrevi o setter e que está retornando o erro acima, ficou o seguinte:

    @set_limite.setter
    def set_limite(self, novo_limite):
        self.__limite = novo_limite
        print("Seu novo limite é de: {}" .format(self.__limite))

Tentei colocar um getter antes para tentar sanar, mas não resolveu:

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

    @set_limite.setter
    def set_limite(self, novo_limite):
        self.__limite = novo_limite
        print("Seu novo limite é de: {}" .format(self.__limite))

Alguma sugestão para contornar aqui?

Obrigado desde já!!

2 respostas
solução!

Parece que você está tendo um problema com o uso de um decorator para o setter de uma propriedade chamada limite. O código que você compartilhou parece correto, mas o erro que você está enfrentando pode estar relacionado a como você está usando o setter. Vou explicar como corrigir isso.

Vamos considerar que você possui uma classe chamada Conta e deseja definir um atributo chamado limite. Aqui está como você pode definir corretamente o getter e o setter para a propriedade limite:

class Conta:
    def __init__(self, saldo, limite):
        self.__saldo = saldo
        self.__limite = limite

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

    @limite.setter
    def limite(self, novo_limite):
        self.__limite = novo_limite
        print("Seu novo limite é de: {}".format(self.__limite))

# Criando uma instância da classe Conta
minha_conta = Conta(1000, 500)

# Acessando e modificando o limite usando o setter
minha_conta.limite = 700

Observe que o nome do setter deve coincidir com o nome da propriedade (neste caso, limite) com a palavra set_ prefixada. Portanto, o setter no seu caso deve ser definido como @limite.setter.

Além disso, quando você deseja acessar e modificar o limite, você deve usar a propriedade limite em vez de set_limite para chamar o setter. O Python se encarregará de chamar o setter automaticamente quando você atribuir um valor à propriedade limite.

Certifique-se de seguir essa convenção e usar a propriedade limite para acessar e modificar o valor do limite. Isso deve resolver o problema que você está enfrentando. Se você ainda estiver tendo problemas, por favor, forneça mais detalhes sobre o erro específico que você está recebendo.

Olá Francisco, tudo bem? Muito obrigado pela sua orientação. Com as suas recomendações deu certo pra mim. No entanto, não consegui entender o motivo do nome da função ter que seguir a mesma estrutura o objeto. A menos que eu esteja interpretando a resolução do problema de forma equivocada, python deveria interpretar o objeto e o nome da def como variáveis independentes.

Por exemplo, tanto no código que deu errado quanto no código correto, os parâmetros que eu defini para o objeto foram:

class Conta:

    def __init__(self, numero_conta, nome_titular, saldo_conta, limite_conta):
        self.__numero = numero_conta
        self.__titular = nome_titular
        self.__saldo = saldo_conta
        self.__limite = limite_conta
        self.__codigo_banco = "001"

Isto é para o limite, chamei de self.__limite = limite_conta

No código que deu erro, somente criei o decorator com o nome de def_limite, desta forma:

    @def_limite.setter
    def def_limite(self, novo_limite):
        self.__limite = novo_limite
        print("Seu novo limite é de: {}" .format(self.__limite))

E no código que deu certo, seguindo suas recomendações, o decorator considerando somente a palavra "limite". Assim:

    @limite.setter
    def limite(self, novo_limite):
        self.__limite = novo_limite
        print("Seu novo limite é de: {}" .format(self.__limite))

Visto isso, posso considerar que tanto o nome dado na "def" da função (def limite (self, novo limite), no decorator (@limite.setter) e no objeto (self.__limite) devem sempre seguir a mesma nomenclatura?

Muito obrigado novamente pela sua atenção.