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!