1
resposta

@property.getter

Fiquei com uma dúvida na Aula 05 do curso de Python 3: Introdução a O.O. É possível definir getters utilizando @property e setters utilizando a sintaxe @<nome_da_propriedade>.setter. No entanto, percebi que ao digitar @property para definir um getter a IDE sugere alguns nomes que podem ser acrescentados, dentro eles há duas sugestões: @property.setter e @property.getter. O que são estas anotações ? Uma coisa que reparei também é que para funcionar o que foi ensinado em aula, necessariamente a definição do getter com @property tem que vir antes do setter, por que isso ocorre ? É pelo fato da linguagem ser interpretada ?

1 resposta

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! =)