Oi Lucas ! Como vai?
Sobre o getter vir antes do setter
Isso ocorre por que você precisa definir primeiro o método em property, para depois usá-lo como referência em ".setter".
O erro que acontece quando você inverte, é que o sistema não encontra referência para aquele parâmetro.
Por exemplo:
Quando você escreve:
@property
def limite(self):
return self.__limite
Você esta definindo o método chamado "limite". Já quando você escreve:
@limite.setter
Você está referenciando "limite". A referencia precisa existir para o trecho funcionar, por isso que o getter vem antes.
Agora sobre property.setter, property.getter
A maneira que aprendemos no curso para criar propriedades com @property, é padronizada como a mais recomendada.
Entretanto existem outras maneiras de criar propriedades. Pelo que entendi "property. setter" e "property.getter", não são usadas com o @, elas aparecem como sugestão porque são passos no processo de outra maneira de criar uma propriedade.
Existe uma função chamada "property()", que também pode ser usada para criar propriedades.
def get_limite(self):
return self.__limite
def set_limite(self, limite):
self.__limite = limite
limite = property(get_limite,set_limite)
Essa última linha, também pode ser escrita da seguinte forma:
limite= property()
limite= limite.getter(get_limite)
limite= limite.setter(set_limite)
Aqui estamos dizendo que limite é uma propriedade, que recebe um getter e um setter.
"limite.getter" é um getter dessa propriedade, ou seja, é um property.getter
"limite.setter" é um setter dessa propriedade, ou seja, é um property.setter
Essa é uma maneira bem mais extensa e descritiva de escrever, mas o resultado é o mesmo. De certa maneira, acredito que é isso que ocorre "por baixo dos panos" quando usamos as notações @property e @limite.setter.
Por favor, me avise se fez sentido! Caso não, tento explicar de outra maneira! Bons estudos! =)