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

@property

Olá Pessoal, bom dia!

Tudo bem?

No meu está dando este erro:

>>> from cliente import Cliente
>>> cliente = Cliente("nan")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  
  AttributeError: property 'nome' of 'Cliente' object has no setter
class Cliente:

    def __init__(self, nome):
        self.nome = nome

    @property
    def nome(self):
        print("chamando @property nome()")
        return self.nome.title()

Por gentileza poderia me ajudar?

Obrigado!

2 respostas

Olá! Tudo bem? O problema está acontecendo porque o nome da property é o mesmo nome do atributo nome, então no construtor da classe Cliente o Python pensa que você está atribuindo o valor nome para a função @property nome. Para resolver esse problema basta você seguir a convenção da comunidade de colocar um _ antes do nome dos atributos, porque assim você está indicando que esse atributo não deve ser acessado diretamente, mas sim através das função @property para pegar o valor e a função @nome.setter para alterar o valor. A seguinte alteração já resolverá o problema:

class Cliente:

    def __init__(self, nome):
        self._nome = nome

    @property
    def nome(self):
        print("chamando @property nome()")
        return self._nome.title()

Você precisa tomar cuidado na função @property para não chamar ela mesma sem querer:

@property
def nome(self):
    print("chamando @property nome()")
    return self.nome.title()

Se você esquecer do _ antes de nome como no exemplo acima, a função @property vai chamar ela mesma infinitamente e fazer seu programa "crashar". Outra coisa que você pode fazer é adicionar um método setter na classe cliente:

class Cliente:

    def __init__(self, nome):
        self._nome = nome

    @property
    def nome(self):
        print("chamando @property nome()")
        return self._nome.title()
    
    @nome.setter
    def nome(self, novo_nome):
        print("chamando setter")
        self._nome = novo_nome

# Testes

cliente = Cliente("João")
cliente.nome = "Joãozinho"
print(cliente.nome)

Espero ter ajudado!

solução!

Olá Breno, boa tarde!

Estimo que esteja tudo bem, contigo e a sua família.

Valeu!!!

Obrigado>