Oii Isabelle, tudo bem com você?
Excelente pergunta =)
Esse erro acontece quando declaramos os mesmos nomes para o atributo, a property de getter e a property de setter. Suponho que você tenha testado algo similar ao código abaixo:
class Autor:
def __init__(self, nome):
self.nome = nome
@property
def nome(self):
return self.nome
@nome.setter
def nome(self, nome):
self.nome = nome
clarice = Autor('Clarice Lispector')
Quando atribuímos o self.nome = nome
, internamente o que o Python fará é verificar se há algum método setter com o nome daquele atributo e nesse caso, ele o encontrará:

Porém, dentro desse método, fazemos a mesma atribuição da linha 4: self.nome = nome
, então o Python novamente irá chamar o mesmo setter. Com isso, ele ficará nesse loop de chamar a si próprio até que se atinja um limite, por isso o erro de RecursionError: maximum recursion depth exceeded
.
A ideia geral é que quando formos criar alguma propriedade de setter da forma exemplificada acima, criemos um novo atributo "privado", seja com um ou dois underscores para mostrar que ele é "privado" e para que não fique com o mesmo nome da propriedade(em python privado não existe, usa-se apenas convenções para dizer ao programador que aquela variável ficará dentro de um contexto específico e não deve ser acessada diretamente pelo "lado de fora"). Veja um exemplo:
class Autor:
def __init__(self, nome):
self.nome = nome
@property
def nome(self):
return self._nome
@nome.setter
def nome(self, nome):
self._nome = nome
clarice = Autor('Clarice Lispector')
clarice.nome = 'Clarice Falcão'
print(clarice.nome)
Você também pode encontrar exemplos de códigos que declarem o atributo com duplo underscore inicialmente. Da forma abaixo:
class Autor:
def __init__(self, nome):
self.__nome = nome
@property
def nome(self):
return self.__nome
@nome.setter
def nome(self, nome):
self.__nome = nome
clarice = Autor('Clarice Lispector')
clarice.nome = 'Clarice Falcão'
print(clarice.nome)
E nesse caso, a propriedade de setter só será chamada quando fizermos: clarice.nome = 'Clarice Falcão'
Pegou a ideia?
Qualquer dúvida, fique a vontade para perguntar. Estou a disposição. Abraços e bons estudos!